为了账号安全,请及时绑定邮箱和手机立即绑定

使用lambda表达式连接pyqt中的插槽

使用lambda表达式连接pyqt中的插槽

幕布斯6054654 2019-08-19 16:40:04
使用lambda表达式连接pyqt中的插槽我正在尝试使用lambda函数连接插槽,但它没有按照我期望的方式工作。在下面的代码中,我成功正确连接前两个按钮。对于我在循环中连接的后两个,这是错误的。在我之前有人有同样的问题,但这个解决方案对我不起作用。我一直盯着我的屏幕半小时,但我无法弄清楚我的代码是如何不同的。class MainWindow(QtGui.QWidget):     def __init__(self):         super(QtGui.QWidget, self).__init__()         main_layout = QtGui.QVBoxLayout(self)         # Works:         self.button_1 = QtGui.QPushButton('Button 1 manual', self)         self.button_2 = QtGui.QPushButton('Button 2 manual', self)         main_layout.addWidget(self.button_1)         main_layout.addWidget(self.button_2)         self.button_1.clicked.connect(lambda x:self.button_pushed(1))         self.button_2.clicked.connect(lambda x:self.button_pushed(2))         # Doesn't work:         self.buttons = []         for idx in [3, 4]:             button = QtGui.QPushButton('Button {} auto'.format(idx), self)             button.clicked.connect(lambda x=idx: self.button_pushed(x))             self.buttons.append(button)             main_layout.addWidget(button)     def button_pushed(self, num):         print 'Pushed button {}'.format(num)按下前两个按钮会产生'Pushing button 1'和'Pushing button 2',另外两个按钮都会产生'Pushed button False',虽然我预计会有3和4。我还没有完全理解lambda机制。究竟有什么联系?指向由lambda生成的函数的指针(使用参数替换)或者是在信号触发时评估的lambda函数?
查看完整描述

3 回答

?
30秒到达战场

TA贡献1828条经验 获得超6个赞

所述QPushButton.clicked信号发射指示按钮的状态的参数。当您连接到lambda插槽时,您指定的可选参数将idx被按钮的状态覆盖。

相反,请将您的连接设为

button.clicked.connect(lambda state, x=idx: self.button_pushed(x))

这样就忽略了按钮状态,并将正确的值传递给您的方法。


查看完整回答
1 反对 回复 2019-08-19
  • 3 回答
  • 0 关注
  • 2005 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信