我想用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")
答案 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)
当您需要提供除菜单项文本之外的其他内容作为参数时,此方法会变得更有用。