使用PyQt4动态添加复选框

时间:2010-08-16 18:43:39

标签: python user-interface dynamic checkbox pyqt4

我有一个使用python和PyQt4构建的简单GUI。用户在程序中输入内容后,程序应根据用户输入的内容向UI添加一定数量的复选框。出于测试目的,我从应用程序开始就有一个复选框,该复选框嵌套在QVBoxLayout内,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 个答案:

答案 0 :(得分:2)

我认为你通过复制QtCreator的输出风格让自己变得艰难。我认为手动编写一些UI以了解它是如何工作的很重要。我怀疑你没有在布局中添加复选框。试试这个(导入*用于清晰):

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

答案 1 :(得分:0)

我最终自己搞清楚了。部分原因是我的错,另一部分是有点hacky(因为它可能没有使用它可能正在使用的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)