1

在从字符串列表中创建 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 构造。

4

1 回答 1

0

这不是关于lambda,而是关于如何在 Qt 中实现具有默认参数的信号。

void triggered(bool = 0)

实际上是两个信号:

void triggered(bool)
void triggered()

PyQt 文档提到了这个信号的默认重载,triggered(bool)因为你的函数接受一个参数,它可以成功地将这个信号连接到你的函数。因此bool参数被传递给item.

您可以通过索引语法选择特定的重载。在这种情况下,您需要没有参数的信号,因此您可以:

action.triggered[()].connect(l)
于 2012-07-04T20:56:52.813 回答