Python PyQt根据用户在spinbox上选择的数量创建组合框
我的目标是根据用户在Python PyQt根据用户在spinbox上选择的数量创建组合框,python,pyqt,pyqt4,qcombobox,Python,Pyqt,Pyqt4,Qcombobox,我的目标是根据用户在QSpinbox上选择的编号,为用户提供qcomboxes 因此,它将是这样的: def myfunction(x): labellist = [] combolist = [] layoutlist = [] layout = QtGui.QVBoxLayout() for i in range(x): labellist.append(QtGui.QLabel('this is label'+str(i))
QSpinbox
上选择的编号,为用户提供qcomboxes
因此,它将是这样的:
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)
用户将在QSpinbox
上选择一个数字,然后使用信号valueChanged(int)
调用另一个函数,创建qcomboxes
,供用户输入数据
一旦用户更改为另一个值。它将根据QSpinbox
值自动增加/减少QComboBox
数字
所以我想出了这样的办法:
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)
即使它根据用户在spin box上选择的数字创建组合框,但当用户增加数字(如3到4)时,它不会删除旧的3个组合框,而是一起变成7个组合框
我该如何解决这个问题?还是有更好的方法来实现类似的结果?您可以在每次spinbox值更改时删除并重新创建所有组合框。它可能不是最有效的,但它很简单 只要有一个引用标签/组合框作为属性的列表。在插槽中,对每个项目调用
deleteLater()
,然后通过将列表设置为[]
来删除引用。最后,重新创建项目,将它们添加到布局并重新填充列表
还有,你应该看看。它们比丑陋的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])