0

这是我的问题。我想创建nQLineEdit小部件(n可以是任何数字,取决于输入值)。我可以创建那些QLineEdit小部件,给它们对象名称和文本,但我不能在所有这些小部件上定义信号(我希望每个QLineEdit小部件在与它交互时都会发出信号)。这是代码的示例:

self.fieldList = {}

for (i, value) in attrMap.iteritems():
    self.fieldList["valueField" + str(i)] = QtGui.QLineEdit()
    self.fieldList["valueField" + str(i)].setObjectName(_fromUtf8("attributeValueField_{0}".format(i)))
    self.fieldList["valueField" + str(i)].setText(_fromUtf8("{0}".format(value.toString())))
    self.fieldList["valueField" + str(i)].cursorPositionChanged.connect(lambda: (self.checkState(self.fieldList["valueField" + str(i)])))

问题仍然存在于最后一行:

self.fieldList["valueField" + str(i)].cursorPositionChanged.connect(lambda: (self.checkState(self.fieldList["valueField" + str(i)])))

我认为该信号会粘在每个小部件上,但是由于循环,信号从小部件“跳转”到小部件,直到它到达最后一个小部件,因此只有最后一个小部件能够发出信号。那么如何安排每个小部件在更改时发出信号?

4

2 回答 2

2

这里的解释和常用解决方案(还有很多,只需搜索例如“python lambda循环参数”:https ://stackoverflow.com/a/938493

另一个常见的解决方案是使用偏函数:

import functools
slot = functools.partial( self.checkState, self.fieldList["valueField" + str(i)] )
self.fieldList["valueField" + str(i)].cursorPositionChanged.connect( slot )
于 2012-06-22T11:43:00.513 回答
0

这里的问题是闭包,i在你的 lambda 中是指i调用 lambda 函数时的值,而不是定义它时的值。所以循环结束后,所有i的 s 都会看到相同的值。

要解决这个问题:

self.fieldList = {}

for (i, value) in attrMap.iteritems():
    self.fieldList["valueField" + str(i)] = QtGui.QLineEdit()
    self.fieldList["valueField" + str(i)].setObjectName(_fromUtf8("attributeValueField_{0}".format(i)))
    self.fieldList["valueField" + str(i)].setText(_fromUtf8("{0}".format(value.toString())))
    self.fieldList["valueField" + str(i)].cursorPositionChanged.connect(lambda old, new, i=i: (self.checkState(self.fieldList["valueField" + str(i)])))

您可以在此处找到有关此问题的更多信息

于 2012-06-22T11:45:18.367 回答