QMainWindow vs QWidget
我找不到关于PyQt5中QMainWindow与QWidget的不同用法的很好的解释(我想大概是Qt)。 根据我的阅读,QMainWindow继承自QWidget,因此应该能够执行QWidget可以做的所有工作。 但是,当我尝试将我从QWidget找到的示例转换为QMainWindow时,布局就搞砸了。
我正在尝试的示例来自https://www.tutorialspoint.com/pyqt/pyqt_qstackedwidget.htm。 (我的GUI将以StackedWidget作为中央窗口小部件,并带有用于导航的侧面板,因此使此示例在QMainWidget中工作将是我自己的代码的良好基础。)
PyQT5转换并略微缩短的版本:
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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | #!/usr/bin/env python3 import sys from PyQt5.QtWidgets import (QApplication, QFormLayout, QLabel, QRadioButton, QCheckBox, QListWidget, QStackedWidget, QLineEdit, QHBoxLayout, QGridLayout ) from PyQt5.Qt import QWidget, QMainWindow class StackedExample(QMainWindow): def __init__(self): super(stackedExample, self).__init__() self.leftlist = QListWidget () self.leftlist.insertItem (0, 'Contact' ) self.leftlist.insertItem (1, 'Personal' ) self.stack1 = QWidget() self.stack2 = QWidget() self.stack1UI() self.stack2UI() self.Stack = QStackedWidget (self) self.Stack.addWidget (self.stack1) self.Stack.addWidget (self.stack2) grid = QGridLayout() self.setLayout(grid) grid.addWidget(self.leftlist,0,0) grid.addWidget(self.Stack,0,1) self.leftlist.currentRowChanged.connect(self.display) self.resize(300,100) self.show() def stack1UI(self): layout = QFormLayout() layout.addRow("Name",QLineEdit()) layout.addRow("Address",QLineEdit()) self.stack1.setLayout(layout) def stack2UI(self): layout = QFormLayout() sex = QHBoxLayout() sex.addWidget(QRadioButton("Male")) sex.addWidget(QRadioButton("Female")) layout.addRow(QLabel("Sex"),sex) layout.addRow("Date of Birth",QLineEdit()) self.stack2.setLayout(layout) def display(self,i): self.Stack.setCurrentIndex(i) def main(): app = QApplication(sys.argv) ex = StackedExample() sys.exit(app.exec_()) if __name__ == '__main__': main() |
这段代码在基于QWidget的情况下运行良好,但是在基于QMainWidget的情况下(如上述版本),所有内容都塞在左上角。
为了在QMainWindow中显示适用于QWidget的布局,需要进行哪些更改?
QMainWindow必须具有中央小部件才能正确显示。 您需要定义一个中央小部件,然后向其添加任何布局,而不是主窗口。
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 | class StackedExample(QMainWindow): def __init__(self): QMainWindow.__init__(self) self.leftlist = QListWidget() self.leftlist.insertItem(0, 'Contact' ) self.leftlist.insertItem(1, 'Personal' ) self.central_widget = QWidget() # define central widget self.setCentralWidget(self.central_widget) # set QMainWindow.centralWidget self.stack1 = QWidget() self.stack2 = QWidget() self.stack1UI() self.stack2UI() self.Stack = QStackedWidget (self) self.Stack.addWidget (self.stack1) self.Stack.addWidget (self.stack2) grid = QGridLayout() self.centralWidget().setLayout(grid) # add the layout to the central widget grid.addWidget(self.leftlist,0,0) grid.addWidget(self.Stack,0,1) self.leftlist.currentRowChanged.connect(self.display) self.resize(300,100) self.show() |
除了为QMainWindow定义的centralWidget之外,还有其他区域。 这是QMainWindow的文档。 它更详细地解释了这一点。