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 回答