QMainWindow 与 QWidget
QMainWindow vs QWidget
我找不到关于 QMainWindow 与 QWidget 在 PyQt5(我猜是一般的 Qt)中的不同用法的很好的解释。根据我的阅读,QMainWindow 继承自 QWidget,因此应该能够完成 QWidget 可以做的一切,甚至更多。但是,当我尝试将我从 QWidget 中找到的示例转换为 QMainWindow 时,布局被搞砸了。
我尝试处理的示例来自 https://www.tutorialspoint.com/pyqt/pyqt_qstackedwidget.htm。 (我的 GUI 将有一个 StackedWidget 作为中央小部件,带有一个用于导航的侧面板,因此让这个示例在 QMainWidget 中工作将是我自己的代码的一个很好的基础。)
PyQT5 转换和略微缩短的版本:
#!/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 必须有一个中央小部件才能正确显示。您需要定义一个中央小部件,然后向其添加任何布局而不是主要 window.
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()
除了centralWidget之外,QMainWindow还定义了其他区域。 Here is the documentation 对于 QMainWindow。它对此进行了更详细的解释。
我找不到关于 QMainWindow 与 QWidget 在 PyQt5(我猜是一般的 Qt)中的不同用法的很好的解释。根据我的阅读,QMainWindow 继承自 QWidget,因此应该能够完成 QWidget 可以做的一切,甚至更多。但是,当我尝试将我从 QWidget 中找到的示例转换为 QMainWindow 时,布局被搞砸了。
我尝试处理的示例来自 https://www.tutorialspoint.com/pyqt/pyqt_qstackedwidget.htm。 (我的 GUI 将有一个 StackedWidget 作为中央小部件,带有一个用于导航的侧面板,因此让这个示例在 QMainWidget 中工作将是我自己的代码的一个很好的基础。)
PyQT5 转换和略微缩短的版本:
#!/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 必须有一个中央小部件才能正确显示。您需要定义一个中央小部件,然后向其添加任何布局而不是主要 window.
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()
除了centralWidget之外,QMainWindow还定义了其他区域。 Here is the documentation 对于 QMainWindow。它对此进行了更详细的解释。