wake-up-neo.com

Was macht das Q_OBJECT-Makro? Warum benötigen alle Qt-Objekte dieses Makro?

Ich habe gerade mit Qt angefangen und festgestellt, dass alle Beispielklassendefinitionen das Makro Q_OBJECT Als erste Zeile haben. Was ist der Zweck dieses Präprozessor-Makros?

119

Aus der Qt-Dokumentation :

Der Meta-Object Compiler, moc, ist das Programm, das die C++ - Erweiterungen von Qt verarbeitet.

Das Tool moc liest eine C++ - Headerdatei. Wenn eine oder mehrere Klassendeklarationen gefunden werden, die das Makro Q_OBJECT enthalten, wird eine C++ - Quelldatei erstellt, die den Metaobjektcode für diese Klassen enthält. Unter anderem wird Meta-Objekt-Code für den Signal- und Slots-Mechanismus, die Laufzeit-Typinformationen und das dynamische Eigenschaftensystem benötigt.

126
Stu Mackellar

Es teilt dem Pre-Compiler einfach mit, dass diese Klasse GUI-Elemente enthält und durch den 'moc' ausgeführt werden muss. Sie müssen dies nur Klassen hinzufügen, die den Signal/Slot-Mechanismus verwenden.
Aber es wird in allen anderen Klassen ignoriert - es verlängert nur die Erstellungszeit.

16
Martin Beckett

Der MOC (Meta Object Compiler) konvertiert die Header-Dateien des Makros Q_OBJECT in den entsprechenden C++ - Quellcode. Es steuert im Grunde den Signal-Slot-Mechanismus und macht ihn für den C++ - Compiler verständlich

8
aditya

1 Aus der Qt-Dokumentation von The Meta-Object System

Das Tool moc liest eine C++ - Quelldatei. Wenn eine oder mehrere Klassendeklarationen gefunden werden, die das Makro Q_OBJECT enthalten, wird eine weitere C++ - Quelldatei erstellt, die den Metaobjektcode für jede dieser Klassen enthält. Diese generierte Quelldatei wird entweder # in die Quelldatei der Klasse eingeschlossen oder in der Regel kompiliert und mit der Implementierung der Klasse verknüpft.

2 Aus der Qt-Dokumentation von THE Q_OBJECT

Das Q_OBJECT-Makro muss im privaten Abschnitt einer Klassendefinition enthalten sein, die ihre eigenen Signale und Slots deklariert oder andere vom Qt-Metaobjektsystem bereitgestellte Dienste verwendet.

3 Aus der Qt-Dokumentation von moc

Das Tool moc liest eine C++ - Headerdatei. Wenn eine oder mehrere Klassendeklarationen gefunden werden, die das Makro Q_OBJECT enthalten, wird eine C++ - Quelldatei erstellt, die den Metaobjektcode für diese Klassen enthält. Unter anderem wird Meta-Objekt-Code für den Signal- und Slots-Mechanismus, die Laufzeit-Typinformationen und das dynamische Eigenschaftensystem benötigt.

4 Aus der Qt-Dokumentation von Signale und Slots

Das Q_OBJECT-Makro wird vom Präprozessor erweitert, um mehrere Member-Funktionen zu deklarieren, die vom moc implementiert werden. Wenn Sie Compiler-Fehler im Sinne von "undefinierter Verweis auf vtable for LcdNumber" erhalten, haben Sie wahrscheinlich vergessen, den moc auszuführen oder die moc-Ausgabe in den Link-Befehl aufzunehmen.

4
Bob Zhang

Das Q_OBJECT-Makro muss im privaten Abschnitt einer Klassendefinition enthalten sein, die ihre eigenen Signale und Slots deklariert oder andere vom Qt-Metaobjektsystem bereitgestellte Dienste verwendet.

0
Andres