用PyQt4动态添加复选框
我用Python和PyQt4做了一个简单的图形界面(GUI)。用户在程序里输入一些内容后,程序应该根据用户的输入在界面上添加一定数量的复选框。为了测试,我在应用程序一开始就放了一个复选框,这个复选框放在一个叫QVBoxLayout的布局里,而这个布局又放在一个叫QGroupBox的组框里。我试着看了PyQt4的文档,但一直没能搞明白怎么做。
这是我创建初始复选框的代码(来自QtCreator的基本输出):
self.CheckboxField = QtGui.QGroupBox(self.GuiMain)
self.CheckboxField.setGeometry(QtCore.QRect(10, 70, 501, 41))
self.CheckboxField.setObjectName("CheckboxField")
self.verticalLayoutWidget = QtGui.QWidget(self.CheckboxField)
self.verticalLayoutWidget.setGeometry(QtCore.QRect(0, 10, 491, 21))
self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
self.CheckboxLayout = QtGui.QVBoxLayout(self.verticalLayoutWidget)
self.CheckboxLayout.setSizeConstraint(QtGui.QLayout.SetMinimumSize)
self.CheckboxLayout.setObjectName("CheckboxLayout")
self.checkBox = QtGui.QCheckBox(self.verticalLayoutWidget)
self.checkBox.setObjectName("checkBox")
self.CheckboxLayout.addWidget(self.checkBox)
接下来这是我尝试添加新复选框的代码(在一个单独的文件里):
checkBox1 = QtGui.QCheckBox(self.window.CheckboxField)
checkBox1.setGeometry(QtCore.QRect(90, 10, 70, 17))
checkBox1.setText(QtGui.QApplication.translate("MainWindow", "Bob Oblaw", None, QtGui.QApplication.UnicodeUTF8))
checkBox1.setObjectName("checkBox1")
self.window.CheckboxLayout.addWidget(checkBox1)
self.window.CheckboxLayout.stretch(1)
self.window.CheckboxField.adjustSize()
self.window.CheckboxField.update()
没有错误,但复选框就是不显示。
2 个回答
1
我最后自己搞定了这个问题。部分原因是我自己的错误,另外一部分有点小技巧(因为可能没有使用Qt可以用的函数)。下面是我的解决方案:
首先,我需要把所有东西放在一个网格布局里,这样当我添加复选框时,它们就能正常显示了。
- 可惜的是,窗口没有随着复选框的增加而自动调整大小,所以我写了一个这样的函数来解决这个问题:
def addCheckbox(self, name):
checkBox = QtGui.QCheckBox(self.window.CheckboxField)
self.window.CheckboxLayout.addWidget(checkBox)
checkBox.setText(name)
newHeight = self.geometry().height()+21#Compensate for new checkbox
self.resize(self.geometry().width(), newHeight)
2
我觉得你在模仿QtCreator的输出风格,这样让自己变得很麻烦。其实,手动编写一些用户界面是很重要的,这样你才能理解它是怎么工作的。我猜测你没有把复选框添加到布局里。试试下面这个方法(这里使用了Import *是为了让代码更清晰):
import sys from PyQt4.QtGui import * from PyQt4.QtCore import * class Window(QWidget): def __init__(self): QWidget.__init__(self) layout = QVBoxLayout() self.checks = [] for i in xrange(5): c = QCheckBox("Option %i" % i) layout.addWidget(c) self.checks.append(c) self.setLayout(layout) if __name__ == '__main__': app = QApplication(sys.argv) w = Window() w.show() app.exec_()