1

いくつかの行を作成します。各行にはチェックボックスとコンボボックスが含まれています。chechboxでコンボボックスを有効/無効にしたい。ただし、この方法でスロットをバインドすると、リスト内の最後のコンボボックスが常に有効化/無効化されます。各チェックボックスを次のコンボボックスで機能させるにはどうすればよいですか?Qt\PySideは初めてです。簡略化されたコードは次のとおりです。

       for i, feature_name in zip(xrange(data_set.n_features), data_set.feature_names):
        rowLayout = QtGui.QHBoxLayout()
        featureLabel = QtGui.QLabel()
        active_checkbox = QtGui.QCheckBox()
        input = QtGui.QSpinBox()
        self.feature_inputs.append(input)
        def abc(state):
            self.feature_inputs[i].setEnabled(state == Qt.Checked)
        active_checkbox.stateChanged.connect(abc)
        rowLayout.addWidget(active_checkbox)
        rowLayout.addWidget(input)
        rowLayout.addWidget(featureLabel)
        self.ui.features_layout.addLayout(rowLayout)
4

2 に答える 2

1

このようなものをお探しですか?

import sys

from PySide.QtCore import *
from PySide.QtGui import *

class Main(QWidget):

    def __init__(self):
        super(Main, self).__init__()
        layout = QVBoxLayout(self)
        for x in xrange(3):
            layout.addLayout(CheckComboGroup())

class CheckComboGroup(QHBoxLayout):

    def __init__(self, parent=None):
        super(CheckComboGroup, self).__init__(parent)

        self.checkBox = QCheckBox()
        self.checkBox.clicked.connect(self.handleComboBox)

        self.comboBox = QComboBox()

        self.addWidget(self.checkBox)
        self.addWidget(self.comboBox)

    def handleComboBox(self):
        self.comboBox.setDisabled(self.comboBox.isEnabled())

app = QApplication([])
main = Main()
main.show()
app.exec_()
于 2013-01-30T20:00:49.557 に答える
1

これは、PySideよりもPythonのスコープの方が問題です。変数iは、abc関数の外部のスコープで定義されています。同じ変数が各abc関数に使用されています。変数は、ループを最後に通過したときの値を持つことになります。そのため、チェックボックスは常に最後のスピンボックスを切り替えます。abc関数ごとに個別のインデックス変数が作成されるようにするには、次のようなものが必要です。

def abcmaker(ind):
    def abc(state):
        self.feature_inputs[ind].setEnabled(state == Qt.Checked)
    return abc
active_checkbox.stateChanged.connect(abcmaker(i))
于 2013-01-30T20:05:57.403 に答える