Ich habe etwa 10 QAction (diese Zahl wird in der Laufzeit variieren) in einer Symbolleiste, die alle dasselbe tun werden, aber verschiedene Parameter verwenden. Ich denke, dem QAction-Objekt Parameter als Attribut hinzuzufügen, und dann sendet das ausgelöste Signal von QAction auch das Objekt selbst an die Callback-Funktion, so dass ich die erforderlichen Parameter für die Funktion erhalten konnte. Ich habe eigentlich 2 Fragen dazu:
Sie können das Action-Objekt selbst mithilfe eines Signal-Mappers senden. Es kann jedoch besser sein, einfach einen Bezeichner zu senden und alle Arbeiten innerhalb des Signal-Handlers auszuführen.
Hier ist ein einfaches Demo-Skript:
%Vor%Wie übergeben Sie Argumente an Callback-Funktionen in PyQt
Sie können functools.partial
aus einer Standard-Python-Bibliothek verwenden. Beispiel mit QAction
:
Sie können eine Lambda-Funktion verwenden, die dem Slot des GUI-Steuerelements zugeordnet ist, um zusätzliche Argumente an die Methode zu übergeben, die Sie ausführen möchten.
%Vor%Quelle: snip2code - Verwenden der Lambda-Funktion zum Übergeben eines zusätzlichen Arguments in PyQt4
Der beste Weg, die Argumente zu übergeben, besteht darin, sie nicht zu bestehen. Sie können die dynamische Natur von Python verwenden und alle Daten, die Sie benötigen, als eigene Eigenschaften für die Widgets selbst festlegen, das Ziel-Widget im Handler mit self.sender()
abrufen und dann die benötigten Eigenschaften direkt aus dem Widget abrufen.
In diesem Beispiel werden fünf Schaltflächen erstellt, und der erforderliche Status wird im Schaltflächen-Widget als my_own_data
property:
Es gibt immer noch einen Fehler in der Art, wie PyQt QSignalMapper benutzt. Ich habe hier eine Lösung gefunden:
Um die beantwortete Frage zu beheben, nehmen Sie folgende Änderung vor:
%Vor%Dies wurde für die folgende Version von Python benötigt:
%Vor%Tags und Links python pyqt signals-slots