Ich versuche, die Menge der Signale zu reduzieren, die ich in meinem Kontextmenüs verwenden muss. Das Menü besteht aus Aktionen, die den Betriebsmodus des Programms wechseln, so dass die von den Slots durchgeführte Operation sehr einfach ist. Unter Angabe die Dokumentation auf QMenu :: ausgelöst,PyQt: Konsolidierung von Signalen zu einem einzelnen Steckplatz
Normalerweise verbinden Sie jede ausgelöst Menü Aktion() Signal an seinen eigenen benutzerdefinierten Slot, aber manchmal werden Sie mehrere Aktionen auf einen einzigen Schlitz zu verbinden, zum Beispiel, wenn Sie haben eine Gruppe eng verbundener Aktionen, wie "linksbündig", "zentriert", "rechtsbündig".
Allerdings kann ich nicht herausfinden, wie dies zu erreichen ist, und die Dokumentation geht nicht weiter ins Detail.
Angenommen, ich habe die Aktionen actionOpMode1
und actionOpMode2
im Menü actionMenu
und einen Steckplatz setOpMode
. Ich möchte setOpMode
mit einem Parameter aufgerufen werden, der sich irgendwie darauf bezieht, welche der Aktionen ausgelöst wurde. Ich habe versucht, verschiedene Permutationen zu diesem Thema:
QObject.connect(self.actionMenu, SIGNAL('triggered(QAction)'), self.setOpMode)
Aber ich habe noch nie es setOpMode zu nennen, was darauf hindeutet, dass actionMenu nie „fühlt ausgelöst“, sozusagen.
In this SO question, wird es vorgeschlagen, dass es mit lamdbas getan werden kann, aber dies:
QObject.connect(self.actionOpMode1, SIGNAL('triggered()'), lambda t: self.setOpMode(t))
gibt "<lambda>() takes exactly 1 argument (0 given)"
. Ich kann nicht sagen, dass ich wirklich verstehe, wie das funktionieren soll, also habe ich möglicherweise etwas falsch gemacht, wenn ich von clicked() zu triggered() gehe.
Wie wird es gemacht?
+1, QSignalMapper ist für diesen Zweck _exactly_ entworfen (und auch ziemlich elegant, denke ich), so bietet es die architektonische Lösung. –
-1 Verwenden Sie QSignalMapper nicht in Python, da ist keine Notwendigkeit. –