Auf Signal zugreifen

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

Hallo,

eine ganz einfache Frage, die ich nicht in der Doku finden konnte.

Code: Alles auswählen

action = QtGui.QAction(name, menu)
action.triggered.connect(some_function)
Wie kann ich von außerhalb, auf some_function zugreifen, wenn ich "action" gegeben habe. Sprich auf das Funktionsobjekt, das emittiert wird, wenn triggered ausgelöst wird.

Grüße,
anogayales
BlackJack

@anogayales: Ich würde mal sagen gar nicht. Es wird das Signal emittiert und nicht die Funktion, und ausserdem gibt es nicht *die* Funktion. Mit einem Signal können 0 bis beliebig viele Slots verbunden sein. Und die Slots können auch ausschliesslich auf C++-Seite existieren.

Nach Lektüre der Qt-Dokumentation zu Signalen/Slots denke ich nicht, dass man an die Slots heran kommen kann. Es ist gewollt, dass sowohl Signale als auch Slots nicht „wissen“ ob und mit wem sie verbunden sind.

Wozu brauchst Du die Funktion denn? Einfach nur ausführen kannst Du sie mit der `QAction.trigger()`-Methode.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Sofern es tatsächlich nichts fertiges gibt, könntest du notfalls `QObject.connect()` re-implementieren. Das Signal-Slot-Konzept lässt sich mittels Wörterbuch abbilden (z.B. Signale als Schlüssel - Empfänger als Werte). Nachdem du dir also die Argumente für `signal` und `receiver` gemerkt hast, rufst du innerhalb der überschriebenen Methode das eigentliche `QObject.connect()` auf. Wie man das eben so beim Überschreiben von Methoden macht...

Bedenke nur, dass bei dieser Variante natürlich alle Widgets, bei denen du Verbindungen tätigst bzw darauf "lauschen" willst, von deiner speziellen `QObject`-Implementierung erben müssten.

Oder geht es dir gar nicht um die bestehenden Verbindungen, sondern wirklich erst um den Moment, in dem etwas durch ein Signal ausgelöst wird?
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

Hintergrund ist, dass ich gerade ein kleines Menü nachbaue, bei dem ich leider nicht von QMenu erben kann. Im Grunde genommen starte ich eine QGraphicsview, dass ein ursprünglich kreatiertes QMenu entgegennimmt und daraus das eigene Menü baut. Wenn ich nun action.trigger() aufrufe, wird mir nur gesagt, dass das Objekt nicht mehr exisitert: RuntimeError: underlying C/C++ object has been deleted. Auch wenn ich darauf eine Referenz halte.
BlackJack

@anogayales: Das hört sich IMHO komisch an. Wenn die `QAction` immer noch über ein Menü erreichbar ist, muss sie ja noch auf der C++-Ebene existieren. Kann es sein, dass Du irgend wo bei den Elternbeziehungen einen Fehler gemacht hast?
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Um BJ zu präzisieren: Hast du darauf geachtet, bei der Initialisierung deiner Widgets die passenden `parent`s mitzugeben?
BlackJack

Um das noch ein bisschen mehr zu präzisieren: Es geht nicht nur um Widgets, sondern generell um jedes `QObject` (C++ und damit auch Python), weil die Objektbäume und die damit einhergehende Speicherverwaltung auf C++-Seite schon bei diesem Qt-„Grundobjekt“ ansetzt.
Antworten