我正在尝试使用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“”,该示例已具有布局
我通过添加以下语句修改了代码: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()