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

2024-09-30 04:31:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个回路。我创建了一个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函数?在


Tags: 实例instance函数connect步骤解决方案rowslot
3条回答

问题是您正在使用lambda创建一个函数,其中函数内的某些变量没有作为参数传递给函数。当lambda函数被执行时,当发出信号时,它使用那些变量的值(比如instance)在那个时刻。要清楚地说,您生成的每个lambda函数都在运行时使用instance的值,而不是定义时间。因此instance只保存对循环最后一次迭代中使用的对象的引用,这解释了您所看到的行为。在

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

根据以上链接的评论:

What you can do is have another function generate the lambda, i.e. something like:

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

And in the connection, call make_callback(i). Then a different lambda is created for each iteration.

因此,您需要对此进行概括,并将instance传递给make_callback函数,然后将lambda定义放入make_callback函数中。我会提供一个明确的例子,但正如另一个答案所说,你的格式在你的问题中似乎变得非常混乱,我可能会弄错你的具体应用。如果你没有按照我说的去做,把你问题中的代码弄清楚,我就去做一个例子!在

将循环变量放入默认参数中,如下所示:

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

这将给每个lambda自己的instance变量的本地副本。在

编辑

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

^{pr2}$

我也有同样的问题,您应该使用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应该设置为函数名参数的实名。在

相关问题 更多 >

    热门问题