Python 嵌套布局被破坏,而不是它们自己

Python 嵌套布局被破坏,而不是它们自己,python,python-3.x,pyqt,pyqt4,Python,Python 3.x,Pyqt,Pyqt4,我有一个简单的窗口,我想在QHboxLayout中水平显示一个按钮和一个标签,然后在QVBoxLayout中垂直显示一些QRadioButton。我试着将这两个部分放到QVBoxLayout中,但没有成功。我的代码的结果 # -*- coding: utf-8 -*- import sys from PyQt4 import QtGui from PyQt4 import QtCore class Application(QtGui.QWidget): """ Main appli

我有一个简单的窗口,我想在
QHboxLayout
中水平显示一个按钮和一个标签,然后在
QVBoxLayout
中垂直显示一些
QRadioButton
。我试着将这两个部分放到
QVBoxLayout
中,但没有成功。我的代码的结果

# -*- coding: utf-8 -*-

import sys
from PyQt4 import QtGui
from PyQt4 import QtCore


class Application(QtGui.QWidget):
    """ Main application window """

    def __init__(self):
        super(Application, self).__init__()
        self.initUI()

    def initUI(self):
        self.openBtn = QtGui.QPushButton("Open", self)
        self.label = QtGui.QLabel("This is a test label", self)

        self.hBox = QtGui.QHBoxLayout(self)
        self.hBox.addWidget(self.openBtn)
        self.hBox.addWidget(self.label)

        self.group = QtGui.QGroupBox("Style", self)
        self.radioBtn1 = QtGui.QRadioButton("Button 1", self.group)
        self.radioBtn2 = QtGui.QRadioButton("Button 2", self.group)
        self.radioLayout = QtGui.QVBoxLayout(self.group)
        self.radioLayout.addWidget(self.radioBtn1)
        self.radioLayout.addWidget(self.radioBtn2)
        self.group.setLayout(self.radioLayout)

        self.hBox2 = QtGui.QHBoxLayout(self)
        self.hBox2.addWidget(self.group)

        self.vBox = QtGui.QVBoxLayout(self)
        self.vBox.addLayout(self.hBox2)
        self.vBox.addLayout(self.hBox)

        self.setLayout(self.vBox)
        self.show()

def main():
    app = QtGui.QApplication(sys.argv)
    mainapp = Application()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()
这是吗

我不明白为什么
QGroupBox
坏了。它自己正确显示,代码如下

# -*- coding: utf-8 -*-

import sys
from PyQt4 import QtGui
from PyQt4 import QtCore


class Application(QtGui.QWidget):
    """ Main application window """

    def __init__(self):
        super(Application, self).__init__()
        self.initUI()

    def initUI(self):
#         self.openBtn = QtGui.QPushButton("Open", self)
#         self.label = QtGui.QLabel("This is a test label", self)
#           
#         self.hBox = QtGui.QHBoxLayout(self)
#         self.hBox.addWidget(self.openBtn)
#         self.hBox.addWidget(self.label)

        self.group = QtGui.QGroupBox("Style", self)
        self.radioBtn1 = QtGui.QRadioButton("Button 1", self.group)
        self.radioBtn2 = QtGui.QRadioButton("Button 2", self.group)
        self.radioLayout = QtGui.QVBoxLayout(self.group)
        self.radioLayout.addWidget(self.radioBtn1)
        self.radioLayout.addWidget(self.radioBtn2)
        self.group.setLayout(self.radioLayout)

        self.hBox2 = QtGui.QHBoxLayout(self)
        self.hBox2.addWidget(self.group)

        self.vBox = QtGui.QVBoxLayout(self)
        self.vBox.addLayout(self.hBox2)
#         self.vBox.addLayout(self.hBox)

        self.setLayout(self.vBox)
        self.show()

def main():
    app = QtGui.QApplication(sys.argv)
    mainapp = Application()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()
产生


我运行安装了Python 3.3的Windows 8 64位计算机。

您将
self
作为所有布局的父级。这将有效地将该布局设置为窗口的主布局(相当于
setLayout
)。你再这样做一次

基本上,在删除旧布局之前,不能设置其他布局。您应该在控制台中看到几个警告

发生的情况是,第一个布局(
self.hBox
)被设置为主布局,其余的被忽略。但是,您的
QGroupBox
将窗口作为父窗口。所以它是全局插入的(左上角)。但是它没有布局,所以它不能调整它的大小,而且它已经缩小了

如果从布局构造函数中删除
self
,将获得所需的结果

顺便说一句,在使用布局时,您可以省略将进入布局的小部件/布局的父级设置。布局将设置小部件之间的父子关系