使用pyqt5动态地将电子添加到QMenu

时间:2018-03-26 10:07:02

标签: pyqt5

我想用pyqt5动态填充菜单。我正在循环所有操作并逐个添加它们,这确实填充了菜单恰到好处,但是,所有操作都连接到最后一个插槽功能。因此,即使我选择item 1,控制台打印也是item 3。以下是我的代码片段:

menu = QMenu()
items = ['item 1', 'item 2', 'item 3']
for item in items:
    self.menu.addAction(item, lambda: self.printMe(item))

def printMe(self, text):
    print(text, "selected")

2 个答案:

答案 0 :(得分:0)

所以我发现如果我们使用partials而不是lambda,那么代码就可以了。

self.menu.addAction(item, functools.partial(self.printMe, item))

答案 1 :(得分:0)

对此的一个解决方案是使用字典而不是列表,并将lambda函数定义为值。这样就可以存储lambda函数,以后可以正确访问它。

menu = QtWidgets.QMenu()
items = {'item 1': lambda: self.printMe('item 1'), 
         'item 2': lambda: self.printMe('item 2'), 
         'item 3': lambda: self.printMe('item 3')}
for key, value in items.items():
    menu.addAction(key, value)

当您需要提供除菜单项文本之外的其他内容作为参数时,此方法会变得更有用。