Mit einer lambda-Ausdruck zu verbinden slots in pyqt

Ich versuche zu verbinden slots mit lambda-Funktionen, es ist aber nicht so funktioniert, wie ich erwarte. In dem code unten, habe ich erfolgreich, in Verbindung mit den ersten beiden Tasten korrekt. Für das zweite zwei, denen ich eine Verbindung in einer Schleife, das geht schief. Jemand vor mir hatte die gleiche Frage (Qt - Connect-slot mit Parameter mit lambda), aber diese Lösung funktioniert nicht für mich. Ich habe starrte auf meinen Bildschirm für eine halbe Stunde, aber ich kann nicht herausfinden, wie mein code ist anders.

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)

Drücken der beiden ersten Tasten Erträge 'Gedrückt Taste 1" und "Geschoben-Taste 2', die anderen beiden sowohl Ausbeute "gedrückte Taste "False", obwohl ich erwartete, 3 und 4.

Ich auch noch nicht verstanden lambda-Mechanismus komplett. Was genau angeschlossen wird? Ein Zeiger auf eine Funktion, die erzeugt wird durch die lambda (mit dem parameter ersetzt werden) oder ist die lambda-Funktion immer dann ausgewertet, wenn das signal feuert?

InformationsquelleAutor zeus300 | 2016-03-05
Schreibe einen Kommentar