关于python:PYQT5 QMainWindow setCentralWidget由多个框布局组成

PYQT5 QMainWindow setCentralWidget consisting of multiple box layouts

对于编程类的项目,我们需要开发一个应用程序,并且必须将PYQT5用于GUI。

我有一个基于QMainWindow的类。有些代码行我不太了解。下面是初始化:

1
2
3
4
5
6
# Snippet 1
class ApplicationWindow(QtWidgets.QMainWindow):
def __init__(self):
    QtWidgets.QMainWindow.__init__(self)
    # self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
    self.setWindowTitle("Main Window")

然后,定义以下变量/ GUI元素:

1
2
3
4
5
6
7
8
    # Snippet 2
    self.main_widget = QtWidgets.QWidget(self)

    l = QtWidgets.QVBoxLayout(self.main_widget)
    sc = MyStaticMplCanvas(width=5, height=4, dpi=100) # just some graph
    dc = MyDynamicMplCanvas(width=5, height=4, dpi=100) # another graph
    l.addWidget(sc)
    l.addWidget(dc)

然后,我尝试添加具有以下内容的水平框布局:

1
2
3
4
5
6
   # Snippet 3
    x = QtWidgets.QHBoxLayout(self.main_widget) # new
    b1 = QtWidgets.QPushButton("Test1") # new
    b2 = QtWidgets.QPushButton("Test2") # new
    x.addWidget(p1) # new
    x.addWidget(p2) # new

最后,生成中央窗口小部件:

1
2
3
    # Snippet 4
    self.main_widget.setFocus()
    self.setCentralWidget(self.main_widget)

该程序本身不会产生任何错误,并且可以正常运行。但是窗口中仅显示代码段2中的两个图形。如果删除

1
self.main_widget

1
l = QtWidgets.QVBoxLayout(self.main_widget)

并将括号留空,仅显示代码段3中的按钮。

以下任务的含义是什么?

1
self.main_widget = QtWidgets.QWidget(self)

您是否可以将垂直和水平框布局组合为一个,从而将两个按钮以及两个图形显示为中央窗口小部件?
这是我最初的计划,我尝试了使用addLayout()和setLayout()选项进行一些操作,并想将这些布局添加到setCentralWidget()中,但没有成功。

您是否有关于如何在基于QMainWindow的类中将多个框布局的组合显示为中央窗口小部件的想法?

非常感谢你。 :)


您可以在布局上使用addLayout()嵌套布局。 然后,内部布局将成为其插入的布局的子级。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class ApplicationWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()

        # self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
        self.setWindowTitle("Main Window")

        self.main_widget = QtWidgets.QWidget(self)
        self.main_widget.setFocus()
        self.setCentralWidget(self.main_widget)

        l = QtWidgets.QVBoxLayout(self.main_widget)
        sc = MyStaticMplCanvas(width=5, height=4, dpi=100)  # just some graph
        dc = MyDynamicMplCanvas(width=5, height=4, dpi=100) # another graph
        l.addWidget(sc)
        l.addWidget(dc)        

       # Snippet 3
        x = QtWidgets.QHBoxLayout()         # self.main_widget) # new
        b1 = QtWidgets.QPushButton("Test1") # new
        b2 = QtWidgets.QPushButton("Test2") # new
        x.addWidget(b1)                     # new   + b1
        x.addWidget(b2)                     # new   + b2

        l.addLayout(x)                                                  # <----

if __name__ =="__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = ApplicationWindow()
    MainWindow.show()
    sys.exit(app.exec_())