使用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函数?
30秒到达战场
相关分类