我有一个回路。我创建了一个QCheckBox
并将其放入QTableWidget
单元格,一切正常。在循环的每个步骤中,我都为myslot SLOT调用了一个connect
函数,但只应用最后一个QCheckBox
实例。我在谷歌上搜索了很多,发现很多人都有我的问题。我已经应用了他们的解决方案,但我的问题仍然存在。在
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
的循环中创建connect
函数?在
问题是您正在使用
lambda
创建一个函数,其中函数内的某些变量没有作为参数传递给函数。当lambda函数被执行时,当发出信号时,它使用那些变量的值(比如instance
)在那个时刻。要清楚地说,您生成的每个lambda函数都在运行时使用instance
的值,而不是定义时间。因此instance
只保存对循环最后一次迭代中使用的对象的引用,这解释了您所看到的行为。在一些有用的信息可以在这里找到(也可以阅读评论)http://eli.thegreenplace.net/2011/04/25/passing-extra-arguments-to-pyqt-slot/
根据以上链接的评论:
因此,您需要对此进行概括,并将
instance
传递给make_callback
函数,然后将lambda
定义放入make_callback
函数中。我会提供一个明确的例子,但正如另一个答案所说,你的格式在你的问题中似乎变得非常混乱,我可能会弄错你的具体应用。如果你没有按照我说的去做,把你问题中的代码弄清楚,我就去做一个例子!在将循环变量放入默认参数中,如下所示:
这将给每个
lambda
自己的instance
变量的本地副本。在编辑
下面是一个简单的脚本,演示如何使用默认lambda参数:
^{pr2}$我也有同样的问题,您应该使用
functools.partial
,例如:当然,argX应该设置为函数名参数的实名。在
相关问题 更多 >
编程相关推荐