Использование лямбда-выражения для подключения слотов в pyqt
Я пытаюсь соединить слоты с лямбда-функциями, но это не работает так, как я ожидаю. В приведенном ниже коде мне удается правильно соединить первые две кнопки. Для вторых двух, которые я соединяю в цикле, это идет не так. У кого-то до меня был такой же вопрос (Qt - Соединить слот с аргументом, используя лямбду), но это решение не работает для меня. Я полчаса смотрю на экран, но не могу понять, чем отличается мой код.
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)
Нажатие первых двух кнопок приводит к «нажатой кнопке 1» и «нажатой кнопке 2», две другие дают «нажатую кнопку ложно», хотя я ожидал 3 и 4.
Я также не полностью понял лямбда-механизм. Что именно связано? Указатель на функцию, сгенерированную лямбда-выражением (с подставленным параметром), или вычисляется ли лямбда-функция при срабатывании сигнала?