Qt QMainWindow和子窗口小部件大小don';不匹配

Qt QMainWindow和子窗口小部件大小don';不匹配,qt,layout,pyqt,pyside,qmainwindow,Qt,Layout,Pyqt,Pyside,Qmainwindow,可能是个问题,但我仍在学习PySide。所以我尝试使用QMainWindow,它有一个QFrame,QFrame有两个标签。我在QMainWindow和QFrame上使用QBoxLayouts。问题是,当我将QFrame设置为200x200时,QMainWindow不会调整大小,它仍然太小,无法同时显示两个标签。如果我错了,请纠正我,但是当使用布局时,QMainWindow不应该自动具有正确的大小吗?另外,当我输出frame.sizeHint()时,它会输出PySide.QtCore.QSize

可能是个问题,但我仍在学习PySide。所以我尝试使用QMainWindow,它有一个QFrame,QFrame有两个标签。我在QMainWindow和QFrame上使用QBoxLayouts。问题是,当我将QFrame设置为200x200时,QMainWindow不会调整大小,它仍然太小,无法同时显示两个标签。如果我错了,请纠正我,但是当使用布局时,QMainWindow不应该自动具有正确的大小吗?另外,当我输出frame.sizeHint()时,它会输出
PySide.QtCore.QSize(97,50)
,但我希望它是200200

下面的代码将重现该问题:

import sys
from PySide import QtGui


class MainWindow(QtGui.QMainWindow):

    def __init__(self):
        super(MainWindow, self).__init__()

        self.initUI()

    def initUI(self):

        #-------
        #CREATE WIDGETS
        #-------
        frame = QtGui.QFrame()
        frame.setStyleSheet("QFrame {background-color: yellow}")
        frame.setGeometry(0, 0, 200, 200)

        someLabel = QtGui.QLabel("SomeLabel")
        someOtherLabel = QtGui.QLabel("SomeOtherLabel")

        self.setCentralWidget(frame)

        #--------
        #CREATE LAYOUT
        #--------

        frameLayout = QtGui.QVBoxLayout()
        frameLayout.addWidget(someLabel)
        frameLayout.addWidget(someOtherLabel)
        frame.setLayout(frameLayout)

        mainLayout = QtGui.QVBoxLayout()
        mainLayout.addWidget(frame)
        self.setLayout(mainLayout)

        self.show()

def main():

    app = QtGui.QApplication(sys.argv)
    mainWindow = MainWindow()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()
这是运行代码后发生的情况:


一个
QMainWindow
已经有了顶级布局,所以你不应该自己设置。您所需要做的就是设置中心小部件,然后向其中添加布局和小部件

因此,您的示例可以这样修复:

    frame.setLayout(frameLayout)

    # get rid of these three lines
    # mainLayout = QtGui.QVBoxLayout()
    # mainLayout.addWidget(frame)
    # self.setLayout(mainLayout)

    self.show()
值得注意的是,PySide中可能存在与此相关的bug/misfeature,因为在PyQt中,您的原始脚本将打印一条有用的错误消息:

QWidget::setLayout:正在尝试在已具有布局的MainWindow“”上设置QLayout“”


在Qt实际设置默认小部件大小之前,您可能调整大小太早了。从构造函数中,尝试使用QueuedConnection发出连接到插槽的信号,并从插槽调整对话框大小。调整大小将在“以后”完成,然后应该可以工作。谢谢你的回答。现在,在阅读文档时,我意识到我误解了QMainWindow的概念,它确实设置了一个布局。我想我可以根据需要在菜单栏和状态栏之间布置不同的小部件(标签、表格等),并将其中一个定义为centralWidget,但现在我看到我需要在centralWidget中布置不同的小部件。我尝试了您的解决方案,现在两个标签都放在窗口内,但窗口大小仍然是97x50,而不是200x200(QFrame的大小)。你能解释一下为什么不是200x200吗?@flouwer。您应该设置主窗口的几何图形(即
self
),而不是中央小部件。子窗口小部件的几何图形由布局决定,但您可以通过设置其最小、最大或固定大小来控制。