PyQt:如何在PyQt4中的QGroupBox中添加网格布局

时间:2014-01-31 10:53:54

标签: python layout pyqt4

我正在尝试使用PyQt4创建一个应用程序窗口。我想创建一个带框架的窗口,在框架内部创建一些小部件,如标签和文本编辑器。 我将框架创建为QGroupBox,以便能够在其上添加标题。 我知道当你处理帧时,HBox和VBox似乎是首选的布局,但是,我想用网格布局管理我的框架内的小部件的位置,我发现它更容易管理。 所以我尝试了这段代码:

import sys
from PyQt4 import QtGui, QtCore

class Example(QtGui.QWidget):

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

        self.initUI()

def initUI(self):      

    hbox = QtGui.QHBoxLayout()
    grid = QtGui.QGridLayout()

    #Definition des Tracing Parameters widgets
    WindowSize = QtGui.QLabel("Window size (m)")
    SampPts = QtGui.QLabel("Sampling points")
    WindowSizeEdit = QtGui.QLineEdit()
    SampPtsEdit = QtGui.QLineEdit()
    TracParamFrame = QtGui.QGroupBox(self)
    TracParamFrame.setTitle("Tracing Parameters")
    hbox.addLayout(grid)

    grid.addWidget(WindowSize,0,0)
    grid.addWidget(WindowSizeEdit,0,1)
    grid.addWidget(SampPts,1,0)
    grid.addWidget(SampPtsEdit,1,1)

    self.setLayout(hbox)

    self.setGeometry(300,300,350,300)
    self.show()


def main():

    app = QtGui.QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

这里的主要想法是创建一个hbox,我放置QGroupBox,然后在里面放置一个网格布局。 问题是在生成的应用程序中,小部件被放置在框架之外,另外我得到错误:

QLayout:尝试将QLayout“”添加到示例“”,它已经有了布局 QWidget :: setLayout:试图在示例“”上设置QLayout“”,它已经有了布局

2 个答案:

答案 0 :(得分:3)

我通过添加以下语句修改了您的代码:TracParamFrame.setLayout(hbox)

添加此代码的代码如下:

import sys
from PyQt4 import QtGui, QtCore

class Example(QtGui.QWidget):

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

        self.initUI()
    def initUI(self):
        hbox = QtGui.QHBoxLayout()
        grid = QtGui.QGridLayout()

        #Definition des Tracing Parameters widgets
        WindowSize = QtGui.QLabel("Window size (m)")
        SampPts = QtGui.QLabel("Sampling points")
        WindowSizeEdit = QtGui.QLineEdit()
        SampPtsEdit = QtGui.QLineEdit()
        TracParamFrame = QtGui.QGroupBox(self)
        TracParamFrame.setTitle("Tracing Parameters")
        hbox.addLayout(grid)

        grid.addWidget(WindowSize,0,0)
        grid.addWidget(WindowSizeEdit,0,1)
        grid.addWidget(SampPts,1,0)
        grid.addWidget(SampPtsEdit,1,1)
        TracParamFrame.setLayout(hbox)

        #self.setLayout(hbox)


        self.setGeometry(300,300,350,300)
        self.show()

def main():

    app = QtGui.QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

答案 1 :(得分:1)

好吧忘记了,我找到了解决方案。我必须使用GroupBox的setLayout方法,如下所示:

TracParamFrame.setLayout(grid)