在对话框(QDialog)的界面创建中,我们使用布局管理器来实现窗口部件(QWidget)的布局,即通过调用 QDialog.setLayout()
方法来设定布局(QLayout)。通过使用布局管理器,我们可以往布局中添加多个窗口部件,并规定它们的位置,最后将布局应用到对话框中,于是对话框便能展示出这些窗口部件。
但在 QMainWindow 中,我们无法直接设定布局,因为 setLayout()
方法是 QWidget 类的方法,而 QDialog 正是继承自 QWidget。
因此,我们也就无法通过直接设定布局来给 QMainWindow 添加窗口部件。那么我们该怎样往 QMainWindow 里添加窗口部件呢?QMainWindow 提供了 setCentralWidget()
方法来设定中心窗口部件。
不过这样一来,我们不就只能往窗体里添加一个窗口部件了吗?确实,不像布局允许我们添加多个部件,中心窗口部件只能是单独的一个 QWidget。不过,它既可以是一个简单的窗口部件,也可以是一个复合窗口部件。因此,如果我们想要在 QMainWindow 中实现多个窗口部件的复合布局,可以通过创建一个复合窗口部件来实现。
如下图所示:
这里的中心窗口部件 QWidget 是一个抽象的类,它提供了基本的特性和必要的方法。还记得前面提到 QDialog 继承自 QWidget 吗?实际上,这与创建对话框类非常相似,只不过我们最后把这个 QWidget类 设置为中心窗口部件,而不是作为最顶级窗口来显示。我们可以将这里的 QWidget 视为之前的 QDialog,它具有 setLayout()
方法,可以设定布局,也可以通过 addWidget()
方法添加窗口部件。
接下来,我们给出示例代码。
首先,创建一个 QWidget 实例,它将作为 QMainWindow 的中心窗口部件:
compoundWidget = QWidget()
然后创建一个布局,并往布局中添加各种窗口部件:
layout = QHBoxLayout()
layout.addWidget(QPushButton("Widget1"))
layout.addWidget(QPushButton("Widget2"))
再将布局应用到复合窗口部件 compoundWidget 中:
compoundWidget.setLayout(layout)
将复合窗口部件设为中心窗口部件:
self.setCentralWidget(compoundWidget)
至此,我们通过创建复合窗口部件的方式,成功实现 QMainWindow 中多个窗口部件的复合布局。
作者:Wray Zheng
原文:http://www.codebelief.com/article/2017/04/python-gui-development-pyqt-create-compound-widget/