Verwenden von Lambda-Ausdrücken zum Verbinden von Slots in PyQt
In Qt können Lambda-Ausdrücke verwendet werden, um Signale mit Slots zu verbinden. Es gibt jedoch einige Einschränkungen bei diesem Ansatz, die zu unerwartetem Verhalten führen können.
Problem:
Nur beim Verbinden mehrerer Tasten mit demselben Steckplatz über einen Lambda-Ausdruck Die letzte Verbindung funktioniert korrekt. Insbesondere sind die Schaltflächen, die manuell über einzelne Aufrufe von connect() verbunden werden, erfolgreich, während diejenigen, die in einer Schleife mithilfe eines Lambda-Ausdrucks verbunden werden, alle das gleiche falsche Ergebnis liefern.
Analyse:
Das Problem ergibt sich aus der Tatsache, dass der Lambda-Ausdruck ausgewertet wird, wenn das Signal ausgelöst wird, und der Wert seines optionalen Arguments durch das Argument des Signals überschrieben wird. Im Fall des QPushButton.clicked-Signals stellt dieses Argument den Zustand der Schaltfläche dar.
Lösung:
Um das Problem zu beheben, sollte der Lambda-Ausdruck geändert werden wie folgt:
button.clicked.connect(lambda state, x=idx: self.button_pushed(x))
Durch Hinzufügen des Status als erstes Argument zum Lambda-Ausdruck kann er ignoriert werden, während der beabsichtigte Wert von weiterhin zulässig ist idx soll an den Slot übergeben werden.
Verstehen der Lambda-Ausdrucksverbindung:
Wenn ein Lambda-Ausdruck zum Verbinden eines Signals verwendet wird, erstellt er eine anonyme Funktion, die ausgewertet wird wann immer das Signal ausgelöst wird. Die Parameter des Lambda-Ausdrucks sind an die Argumente des Signals gebunden, in diesem Fall an den Zustand der Schaltfläche. Der Slot wird dann mit dem Ergebnis des Lambda-Ausdrucks als Argument aufgerufen.
Das obige ist der detaillierte Inhalt vonWarum führt die Verwendung von Lambda-Ausdrücken zum Verbinden mehrerer Schaltflächen mit demselben Slot in PyQt zu unerwartetem Verhalten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!