commands数组包含一个元组列表,每个元组包含一个名称和将处理事件的函数。对于每对,创建一个新按钮并将其添加到QListWidget。 问题是所有按钮最终调用相同的处理函数。列表中的最后一个。我已经使用我的调试器进行了检查,并且它通过列表正确循环,并且每个循环都传递了正确的处理函数。
这是生成按钮的功能。
def load_commands(self):
for name, handler in commands:
btn = QtGui.QPushButton(name)
btn.clicked.connect(lambda: handler(self))
item = QtGui.QListWidgetItem()
item.setSizeHint(Qt.QSize(0, 30))
self.list_commads.addItem(item)
self.list_commads.setItemWidget(item, btn)
[编辑]在每个循环结束时尝试将btn和item设置为None。它不起作用。
答案 0 :(得分:1)
您需要保留对每个处理程序的引用,否则只有最后一个将留在范围内。一种方法是使用默认参数:
btn.clicked.connect(lambda *args, handler=handler: handler(self))
请注意,clicked
始终会发送按钮的已检查状态,因此*args
可以避免破坏默认参数。