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
是为了避免破坏默认参数。
命令数组包含一个元组列表,每个元组包含一个名称和将处理事件的函数。对于每一对,都会创建一个新按钮并将其添加到 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
是为了避免破坏默认参数。