我想将调用信号的对象作为参数传递给函数,以便我可以在该函数中使用该对象进行操作。该对象是 QLineEdit 小部件。这是示例:
self.fieldList = []
for i in range(10):
self.valueField = QtGui.QLineEdit()
self.fieldList.append(self.valueField)
self.fieldList[i].cursorPositionChanged.connect(lambda: (self.checkState(self.fieldList[i], palette1, palette2)))
def checkState(self, line, palette1, palette2):
if len(line.text()) > 3:
line.setPalette(palette1)
else:
line.setPalette(palette2)
因此,如您所见,我试图将列表元素self.fieldList[i]作为参数传递给checkState()函数中的名称行。如果我在checkState()函数中明确定义fieldList元素(即self.fieldList[0] ) ,则代码可以完美运行,但我不能将其作为参数传递。我究竟做错了什么?
顺便提一句。当我尝试运行程序时,编译器没有给我错误消息,但它根本不会做它应该做的工作(当我写超过 3 个字符时改变 QLineEdit 的颜色)
编辑:
@dex19dt
是的,这是一个例子,但你是对的!只有最后一个 QLineEdit 可以正常工作!
问题是,我不能给所有这些小部件命名,因为它们的数量取决于所选的层,这意味着有时有 5 个小部件,有时甚至是 11 或 75 个。
我可以轻松地命名这些小部件并设置文本,如下所示:
self.fieldList[i].setObjectName(_fromUtf8("attributeValueField_{0}".format(i)))
self.fieldList[i].setText(_fromUtf8("{0}".format(value.toString())))
这适用于每个小部件,但我不知道如何定义信号?你有想法吗?
编辑:
@dex19dt
好的,所以我问了这个索引没有“坚持”到函数调用的问题,我发现这正是 python 的工作方式,为了解决这个问题,我需要替换这一行:
self.fieldList[i].cursorPositionChanged.connect(lambda: (self.checkState(self.fieldList[i], palette1, palette2)))
有了这个:
self.fieldList[i].cursorPositionChanged.connect(lambda old, new, i=i: (self.checkState(self.fieldList[i], palette1, palette2)))
所以这种方式当前索引复制到信号索引。虽然我不太确定为什么会有old, new
一部分。它是指 lambda 函数还是简单地将左定义i
为旧变量,右定义i
为新变量...尝试谷歌搜索,但没有成功。