Python 循环中的少量插槽连接
我创建了几行。每行包含复选框和组合框。我希望复选框启用\取消组合框。但若我以这种方式绑定插槽,它总是启用\禁用列表中的最后一个组合框。如何使每个复选框与下一个组合框一起工作?我是Qt\PySide的新手。以下是简化的代码:Python 循环中的少量插槽连接,python,qt,pyqt,pyside,Python,Qt,Pyqt,Pyside,我创建了几行。每行包含复选框和组合框。我希望复选框启用\取消组合框。但若我以这种方式绑定插槽,它总是启用\禁用列表中的最后一个组合框。如何使每个复选框与下一个组合框一起工作?我是Qt\PySide的新手。以下是简化的代码: for i, feature_name in zip(xrange(data_set.n_features), data_set.feature_names): rowLayout = QtGui.QHBoxLayout() fe
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)
你在找这样的东西吗
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_()
这是一个与Python中的scope有关的问题,而不是与PySide有关的问题。变量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))
另一方面,我建议不要使用输入作为变量;input()是Python中的内置函数。很难选择接受哪个asnwer。两人都有很好的想法,但@JustinPeel向我解释示波器的问题,所以我将使用他的答案。