循环中的QtCore.QObject.connect只影响最后一个实例

我有一个循环。 我创build了一个QCheckBox并把它放在一个QTableWidget单元格中,一切正常。 在循环的每一步中,我都调用了myslot SLOT的connect函数,但只应用了最后一个QCheckBox实例。 我GOOGLE了很多,发现很多人有我的问题。 我已经应用了他们的解决scheme

 for row in xrange(len(uniqueFields)): instance = QtGui.QCheckBox(uniqueFields[row], findInstance.tableWidget) print QtCore.QObject.connect(instance, QtCore.SIGNAL(_fromUtf8("stateChanged (int)")), lambda: findInstance.projectsInstance.myslot( "TWCH", findInstance, instance.text(), instance.checkState(), instance)) findInstance.tableWidget.setRowCount(findInstance.tableWidget.rowCount() + 1) findInstance.tableWidget.setCellWidget(row, 0, instance) 

注意:我的connect函数返回True

如何在枚举所有instances的循环中创buildconnect函数?

我有同样的问题,你应该使用functools.partial如:

 for key, val in a_DICT_THAT_YOU_STORED_YOUR_OBJECTS_AND_STRINGS: obj = partial( findInstance.projectsInstance.myslot,arg1="TWCH",arg2=self,arg3=key,arg4=val.checkState() ) QtCore.QObject.connect(val, QtCore.SIGNAL(_fromUtf8("stateChanged (int)")), obj) 

当然,argX应该设置为你的函数名称参数的真实名称。

将循环variables放在默认参数中,如下所示:

 lambda state, instance=instance: findInstance.projectsInstance.myslot( "TWCH", findInstance, instance.text(), instance.checkState(), instance) 

这将给每个lambda自己的本地副本的instancevariables。

编辑

这是一个简单的脚本,演示如何使用默认的lambda参数:

 from PyQt4 import QtGui class Window(QtGui.QWidget): def __init__(self): QtGui.QWidget.__init__(self) layout = QtGui.QVBoxLayout(self) for index in range(4): instance = QtGui.QCheckBox('Checkbox(%d)' % index, self) instance.stateChanged.connect( lambda state, instance=instance: self.mySlot(instance.text())) layout.addWidget(instance) def mySlot(self, text): print('clicked: %s' % text) if __name__ == '__main__': import sys app = QtGui.QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_()) 

问题是你正在创build一个使用lambda的函数,其中函数内部的一些variables没有被作为parameter passing给函数。 当lambda函数被执行的时候,当信号被发射的时候,它使用那个时刻那些variables的值(比如instance )。 要清楚的是,你所做的每个lambda函数都是在运行时使用instance的值,而不是定义时间。 所以instance只持有对我们循环的最后一次迭代中使用的对象的引用,这解释了你所看到的行为。

一些有用的信息可以在这里find(阅读评论) http://eli.thegreenplace.net/2011/04/25/passing-extra-arguments-to-pyqt-slot/

从以上链接的评论:

你可以做的是有另一个函数生成lambda,即类似的东西:

 def make_callback(param): return lambda: self.on_button(param) 

在连接中,调用make_callback(i) 。 然后为每个迭代创build一个不同的lambda。

所以你会想要概括这个,并将诸如instance东西传递给make_callback函数,然后将你的lambda定义放在make_callback函数中。 我会提供一个明确的例子,但正如另一个答案所说,你的格式似乎已经变得非常混乱在你的问题,我可能会得到错误的具体应用程序。 如果你没有遵循我所说的话,那就把你的问题的代码更清晰一些,然后我将创build一个例子!