Seite 1 von 1
Auf Signal zugreifen
Verfasst: Dienstag 25. Oktober 2011, 21:31
von anogayales
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
Re: Auf Signal zugreifen
Verfasst: Mittwoch 26. Oktober 2011, 05:40
von 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.
Re: Auf Signal zugreifen
Verfasst: Mittwoch 26. Oktober 2011, 06:21
von snafu
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?
Re: Auf Signal zugreifen
Verfasst: Mittwoch 26. Oktober 2011, 12:20
von anogayales
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.
Re: Auf Signal zugreifen
Verfasst: Mittwoch 26. Oktober 2011, 13:04
von 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?
Re: Auf Signal zugreifen
Verfasst: Mittwoch 26. Oktober 2011, 15:32
von snafu
Um BJ zu präzisieren: Hast du darauf geachtet, bei der Initialisierung deiner Widgets die passenden `parent`s mitzugeben?
Re: Auf Signal zugreifen
Verfasst: Mittwoch 26. Oktober 2011, 16:14
von 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.