SIGNAL → SLOT (Qt)

Aus C++_PHP_und_mehr
Wechseln zu: Navigation, Suche

Slot meinSlot(...) einer von QObject abgeleiteten Klasse meineKlasse wird zur Laufzeit mittels QObject::connect(&andereKlasse, SIGNAL(einSignal(...)), &meineKlasse, SLOT(meinSLOT(...)), Qt::ConnectionType type = Qt::AutoConnection) mit Signal einSignal(...) derselben oder einer anderen Klasse verbunden, auch über unterschiedliche Threads hinweg[QtR 1].
Die Parametertypen von Signal und Slot müssen übereinstimmen, es darf aber nur der Type angegeben werden.
Der Default-Typ der Verbindung ist Qt::AutoConnection, dh. falls Signalsender und Slot im gleichem Thread liegen, wird der Slot wie eine Funktion direkt aufgerufen, anschließend kehrt der Programmablauf an die Stelle hinter der Signalauslösung zurück. Wenn man das nicht will, zB. weil man im Slot das Senderobjekt löscht, muss man mit Typ Qt::QueuedConnection erzwingen, dass der Slot erst nach Rückkehr zur EventLoop ausgeführt wird.


Vorlage:AchtungWenn in dem Modul mit der Klasse #include <QObject> fehlt, wird ein Laufzeitfehler[1] in der IDE:Ausgabe der Anwendung angezeigt, obwohl kein Compilerfehler gemeldet wird, vieleicht weil der Header indirect über andere Header geladen wird. Scheint ab Version 5.2 nicht mehr zu gelten.
Dafür ist aber ein anderer Effekt aufgetreten:

  • Wenn mit Release kompiliert wird, führt ein fehlendes Q_OBJECT-Macro zum Compiler-Error.
  • Wenn mit Debug kompiliert wird, wird trotz fehlendem Q_OBJECT-Macro das Programm durchkompiliert und ausgeführt, aber es wird eine fehlende Connection in der IDE angezeigt.

Irgendwann unter nicht eindeutigen zu klärenden Bedingungen trat dann folgender Fehler auf:

  • Wenn das Q_OBJECT-Macro hinzugefügt wird und unter Debug kompiliert wird, wird plötzlich eine fehlende

"virtual table" mit den Zeigern auf die virtuellen Funktion moniert. Verlagern der Klassendeklaration in eine andere Datei mit der Basisklasse beseitigt diesen Effekt.

  • Unter Release alles ok.

Anscheinend ist irgendwann der MetaCompiler von Qt überfordert.

Fußnoten

  1. TODO: Wie werden Laufzeitfehler, Debuggerausgaben usw ohne IDE angezeigt.

Quellen

  • aus der Qt Reference Documentation 5.3:
  1. [1]