python-3.x - QMainWindow 与 QWidget

标签 python-3.x pyqt pyqt5 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 必须有一个中央小部件才能正确显示。您需要定义一个中央小部件,然后向其添加任何布局而不是主窗口。

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 之外,还有其他区域。 Here is the documentation对于 QMainWindow。它对此进行了更详细的解释。

关于python-3.x - QMainWindow 与 QWidget,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49494759/

相关文章:

python - 用新的布局替换 QScrollArea 的布局

python - 在选项卡式停靠小部件中重置焦点

python - 如何使用pytest-qt自动化鼠标拖动?

python - 读取文件并与字典进行比较

python-3.x - 如何遍历两个列表并回收第二个列表直到第一个列表结束

python - 如何计算两个时间戳的小时差并排除周末

python - Pycharm 不显示 `PyQt5` 程序的错误信息(例如 `TypeError` )

python-3.x - 如何修复 "AttributeError: module ' pycocotools' has no attribute 'mask' "python 中的错误

python - QGridlayout 和 QGroupbox 对齐

python - 在 QProgressBar 内添加文本和完成百分比