Динамическое добавление флажков с помощью PyQt4 - PullRequest
0 голосов
/ 16 августа 2010

У меня есть простой графический интерфейс, построенный с использованием Python и PyQt4. После того, как пользователь вводит что-то в программу, программа должна добавить определенное количество флажков в пользовательский интерфейс в зависимости от того, что было введено пользователем. Для целей тестирования у меня есть один флажок, существующий в приложении с самого начала, и этот флажок вложен в 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 ]

2 голосов
/ 17 августа 2010

Я думаю, что вы усложняете себе жизнь, копируя стиль вывода QtCreator.Я думаю, что важно вручную кодировать некоторые пользовательские интерфейсы, чтобы увидеть, как это работает.Я подозреваю, что вы не добавляете флажок к макету.Попробуйте что-нибудь такое (здесь для ясности используется импорт *):

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_()
0 голосов
/ 17 августа 2010

Я сам все понял.Часть из них была моей ошибкой, а другая часть немного хакерской (видимо, поскольку она, вероятно, не использует функцию 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)
...