在从字符串列表中创建 PyQt 菜单的后续操作中,我还在动态创建菜单并想知道单击了哪个菜单项。因此,我使用了一段代码,例如:
for item in ADDABLE_OBJECTS:
action = self.menuAdd.addAction(item)
l = lambda item=item: self.doStuff(item)
action.triggered.connect(l)
def doStuff(self, item):
print "Item: ", item
输出:
项目:假(默认的“布尔”参数,如 Qt 文档中针对触发()信号所述)
正如我认为与 connect(object, SIGNAL(...), slot) 相比,object.connect() 是“新”形式。我也可以更好地工作,因为可以在编译时检查信号名称。但是,它没有用。我得到的只是'bool = false'(如触发()的Qt文档中所述)。所以在搜索后遇到了上面提到的网址。不,我有这个:
for item in ['One', 'Two', 'Three']:
action = self.menuAdd.addAction(item)
l = lambda item=item: self.doStuff(item)
action.triggered.connect(l)
self.connect(action, SIGNAL('triggered()'), l)
这给出了(单击菜单一次):
项目:假(action.triggered.connect(l) 行,错误) 项目:一(self.connect 行,对)
为什么这两个行为不同?我以前从未注意到这两种连接之间有什么区别,直到我使用了这个 lambda 构造。