1

私の目的は、ユーザーQComboBoxesが で選択した番号に応じてユーザーに提供することQSpinboxです。

したがって、次のようになります。

その後、ユーザーがデータを入力するために作成する別の関数を呼び出したい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 に答える