pyqt4 中的按钮最终具有相同的事件处理程序,即使它们不应该

Buttons in pyqt4 end up having the same event handler even though they shouldn't

命令数组包含一个元组列表,每个元组包含一个名称和将处理事件的函数。对于每一对,都会创建一个新按钮并将其添加到 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。没用。

您需要保留对每个处理程序的引用,否则只会保留最后一个处理程序。一种方法是使用默认参数:

    btn.clicked.connect(lambda *args, handler=handler: handler(self))

注意 clicked 总是发送按钮的选中状态,所以 *args 是为了避免破坏默认参数。