PyQt Senden Parameter Schlitz, wenn an einen Signalanschluss
Frage
Ich habe eine Task-Leiste Menü, dass, wenn auf einen Schlitz verbunden geklickt wird, der das Triggerereignis wird. Das Problem ist jetzt, dass ich der Menüpunkt angeklickt wurde wissen wollen, aber ich weiß nicht, wie diese Information an die Funktion verbunden zu senden. Hier wird die verwendet, um die Wirkung auf die Funktion zu verbinden:
QtCore.QObject.connect(menuAction, 'triggered()', menuClickedFunc)
Ich weiß, dass einige Ereignisse einen Wert zurückgeben, aber ausgelöst () nicht. So wie mache ich das passieren? Muss ich mein eigenes Signal machen?
Lösung
Verwenden Sie eine lambda
Hier ist ein Beispiel aus dem PyQt Buch :
self.connect(button3, SIGNAL("clicked()"),
lambda who="Three": self.anyButton(who))
By the way, können Sie auch functools.partial
verwenden, aber ich finde die lambda
Methode einfacher und übersichtlicher.
Andere Tipps
Wie bereits erwähnt hier Sie die Lambda-Funktion können zusätzliche Argumente für die Methode, die Sie ausführen wollen passieren.
In diesem Beispiel eine Zeichenkette obj an die Funktion AddControl passieren kann () aufgerufen wird, wenn die Taste gedrückt wird.
# Create the build button with its caption
self.build_button = QPushButton('&Build Greeting', self)
# Connect the button's clicked signal to AddControl
self.build_button.clicked.connect(lambda: self.AddControl('fooData'))
def AddControl(self, name):
print name
Quelle: snip2code - Lambda-Funktion verwenden Um zusätzliches Argument in PyQt4 Pass
verwenden functools.partial
sonst werden Sie feststellen, Sie nicht Argumente übergeben können dynamisch, wenn Skript ausgeführt wird, wenn Sie Lambda verwenden.
In der Regel sollten Sie jeden Menüpunkt in einem anderen Steckplatz angeschlossen haben, und haben jeder Schlitz die Funktionalität behandelt nur für seinen eigenen Menüpunkt. wenn Sie Menüpunkte wie „Speichern“, „close“, „offen“ haben, Sie sollten beispielsweise ein separater Steckplatz für jeden machen, versuchen Sie nicht einen einzigen Schlitz mit einer Case-Anweisung in ihm zu haben.
Wenn Sie nicht, dass es so machen wollen, können Sie die QObject :: Sender () Funktion einen Zeiger auf den Sender zu erhalten (dh das Objekt, das das Signal ausgesendet). Ich möchte ein bisschen mehr darüber hören, was Sie versuchen, wenn auch zu erreichen.
Ich möchte auch hinzufügen, dass Sie die sender
Methode verwenden können, wenn Sie nur, was Sie brauchen, um herauszufinden, Widget, das Signal gesendet. Zum Beispiel:
def menuClickedFunc(self):
# The sender object:
sender = self.sender()
# The sender object's name:
senderName = sender.objectName()
print senderName