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?

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top