1

我的目标是根据用户QComboBoxesQSpinbox.

所以,它会是这样的:

用户将选择一个数字QSpinbox,之后,通过使用信号valueChanged(int)我想调用另一个函数,该函数将为QComboBoxes用户输入数据。

一旦用户更改为另一个值。它将QComboBox根据QSpinbox值自动增加/减少数字。

所以我想出了这样的事情:

def myfunction(x):
    labellist = []
    combolist = []
    layoutlist = []
    layout = QtGui.QVBoxLayout()
    for i in range(x):
        labellist.append(QtGui.QLabel('this is label'+str(i))
        combolist.append(QtGui.QComboBox())
        layoutlist.append(QtGui.QHBoxLayout())
        layoutlist[i].addWidget(labellist[i])
        layoutlist[i].addWidget(combolist[i])
        layout.addLayout(layoutlist[i])


self.connect(number,QtCore.SIGNAL("valueChanged(int)"),myfunction)

即使它根据用户在旋转框上选择的数字创建组合框,但当用户增加数字(例如 3 到 4)时,它不会删除旧的 3 个组合框,而是一起变成 7 个组合框。

我该如何解决?或者有没有更好的方法来达到类似的结果?

4

1 回答 1

2

每次旋转框值更改时,您都可以删除并重新创建所有组合框。它可能不是最有效的,但它非常简单。

只需有一个引用标签/组合框作为属性的列表。在您的插槽中,调用deleteLater()每个项目,然后通过将列表设置为来删除引用[]。最后,重新创建项目,将它们添加到您的布局并重新填充您的列表。

此外,您应该看看New Style Signals and Slots。它们比丑陋的 C++ 风格连接更好。

class DynamicComboBoxes(QtGui.QWidget):
    def __init__(self, parent=None):
        super(DynamicComboBoxes, self).__init__(parent)
        vbox = QtGui.QVBoxLayout(self)
        spinbox = QtGui.QSpinBox(self)
        spinbox.setRange(0,10)
        spinbox.valueChanged.connect(self.onChangeValue)
        vbox.addWidget(spinbox)
        self.grid = QtGui.QGridLayout()
        self.itemlist = []
        vbox.addLayout(self.grid)
        vbox.addStretch(1)


    def onChangeValue(self, val):
        for label, combobox in self.itemlist:
            label.deleteLater()
            combobox.deleteLater()
        self.itemlist = []
        for i in range(val):
            label = QtGui.QLabel('This is Label {}'.format(i))
            combobox = QtGui.QComboBox()
            self.grid.addWidget(label, i, 0)
            self.grid.addWidget(combobox, i, 1)
            self.itemlist.append([label, combobox])
于 2013-11-04T11:16:49.080 回答