用PyQt4动态添加复选框

0 投票
2 回答
7159 浏览
提问于 2025-04-16 02:52

我用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_()

撰写回答