使用PyQt4动态添加复选框

2024-10-06 12:27:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个使用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()

没有错误,复选框不显示。


Tags: selfwindow复选框pyqt4checkboxqtguiqtcoresetobjectname
2条回答

我认为你通过复制QtCreator的输出风格让自己的生活变得艰难。我认为手动编写一些ui代码以了解其工作原理很重要。我怀疑你没有在布局中添加复选框。试试这个(这里用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_()

最后我自己想出来了。一部分是我的错,另一部分有点老套(因为它可能没有使用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)

相关问题 更多 >