我正在尝试使用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函数在信号触发时被评估?
action.triggered.connect(lambda checked=None, service=service: printService(service))
,因为显然PySide在接收器的签名不匹配时不会发送checked
。 - johnsonidx
值将是循环中所有连接信号的最后一次迭代的值(包括以前的迭代)。避免这种情况的方法是将其设置为函数/lambda 的未使用关键字参数的默认值。请参见 https://dev59.com/5nA75IYBdhLWcg3wK10p 以获取稍长的解释。 - three_pineapples