【发布时间】:2016-06-19 13:47:32
【问题描述】:
我正在尝试将插槽与 lambda 函数连接起来,但它没有按我预期的方式工作。在下面的代码中,我成功地正确连接了前两个按钮。对于我循环连接的后两个,这是错误的。在我之前有人有同样的问题 (Qt - Connect slot with argument using 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)
按下前两个按钮会产生“Pushed button 1”和“Pushed button 2”,其他两个都产生“Pushed button False”,尽管我预计会出现 3 和 4。
我也没有完全理解 lambda 机制。究竟是什么联系起来的?指向由 lambda 生成的函数的指针(参数被替换)还是在信号触发时评估 lambda 函数?
【问题讨论】: