Das Metaobjektsystem

Das Metaobjektsystem von Qt bietet den Signal- und Slot-Mechanismus für die Kommunikation zwischen Objekten, Typinformationen zur Laufzeit sowie das dynamische Eigenschaftssystem.

Das Metaobjektsystem basiert auf drei Komponenten:

  1. Die Klasse ` QObject ` dient als Basisklasse für Objekte, die das Metaobjektsystem nutzen können.
  2. Das Makro ` Q_OBJECT ` wird verwendet, um Metaobjekt-Funktionen wie dynamische Eigenschaften, Signale und Slots zu aktivieren.
  3. Die Meta-Object Compiler (moc) versorgt jede Unterklasse von ` QObject ` mit dem notwendigen Code zur Implementierung von Metaobjekt-Funktionen.

Das Tool „ moc “ liest eine C++-Quelldatei ein. Findet es eine oder mehrere Klassendeklarationen, die das Makro „ Q_OBJECT “ enthalten, erzeugt es eine weitere C++-Quelldatei, die den Metaobjekt-Code für jede dieser Klassen enthält. Diese generierte Quelldatei wird entweder per „ #include “ in die Quelldatei der Klasse eingebunden oder – was üblicher ist – kompiliert und mit der Implementierung der Klasse verknüpft.

Neben der Bereitstellung des Signale-und-Slots-Mechanismus für die Kommunikation zwischen Objekten (dem Hauptgrund für die Einführung des Systems) bietet der Metaobjektcode die folgenden zusätzlichen Funktionen:

Es ist auch möglich, mit ` qobject_cast()` dynamische Typumwandlungen bei ` QObject `-Klassen durchzuführen. Die Funktion ` qobject_cast()` verhält sich ähnlich wie der Standard-C++-Befehl ` dynamic_cast()`, mit dem Vorteil, dass sie keine RTTI-Unterstützung benötigt und über die Grenzen dynamischer Bibliotheken hinweg funktioniert. Sie versucht, ihr Argument in den in spitzen Klammern angegebenen Zeigertyp umzuwandeln, und gibt einen Zeiger ungleich Null zurück, wenn das Objekt vom richtigen Typ ist (was zur Laufzeit ermittelt wird), oder „ nullptr “, wenn der Typ des Objekts inkompatibel ist.

Nehmen wir beispielsweise an, dass ` MyWidget ` von ` QWidget ` erbt und mit dem Makro ` Q_OBJECT ` deklariert ist:

    QObject *obj = new MyWidget;

Die Variable ` obj ` vom Typ ` QObject *` verweist tatsächlich auf ein ` MyWidget `-Objekt, sodass wir sie entsprechend umwandeln können:

    QWidget *widget = qobject_cast<QWidget *>(obj);

Die Typumwandlung von ` QObject ` zu ` QWidget ` ist erfolgreich, da das Objekt tatsächlich ein ` MyWidget` ist, das eine Unterklasse von ` QWidget` darstellt. Da wir wissen, dass ` obj ` ein ` MyWidget` ist, können wir es auch in ` MyWidget *` umwandeln:

    MyWidget *myWidget = qobject_cast<MyWidget *>(obj);

Die Typumwandlung in ` MyWidget ` ist erfolgreich, da ` qobject_cast()` keinen Unterschied zwischen integrierten Qt-Typen und benutzerdefinierten Typen macht.

    QLabel *label = qobject_cast<QLabel *>(obj);
    // label is nullptr

Die Typumwandlung zu „ QLabel “ schlägt hingegen fehl. Der Zeiger wird dann auf „ nullptr “ gesetzt. Dies ermöglicht es, Objekte unterschiedlicher Typen zur Laufzeit je nach Typ unterschiedlich zu behandeln:

    if (QLabel *label = qobject_cast<QLabel *>(obj)) {
        label->setText(tr("Ping"));
    } else if (QPushButton *button = qobject_cast<QPushButton *>(obj)) {
        button->setText(tr("Pong!"));
    }

Zwar ist es möglich, ` QObject ` als Basisklasse ohne das Makro ` Q_OBJECT ` und ohne Metaobjektcode zu verwenden, doch stehen weder Signale und Slots noch die anderen hier beschriebenen Funktionen zur Verfügung, wenn das Makro ` Q_OBJECT ` nicht verwendet wird. Aus Sicht des Metaobjektsystems entspricht eine Unterklasse von ` QObject ` ohne Metacode ihrem nächsten Vorfahren mit Metaobjektcode. Das bedeutet beispielsweise, dass ` QMetaObject::className()` nicht den tatsächlichen Namen Ihrer Klasse zurückgibt, sondern den Klassennamen dieses Vorfahren.

Daher empfehlen wir dringend, dass alle Unterklassen von ` QObject ` das Makro ` Q_OBJECT ` verwenden, unabhängig davon, ob sie tatsächlich Signale, Slots und Eigenschaften nutzen oder nicht.

Siehe auch „ QMetaObject“ , „Qt's Property System“ und „Signals and Slots“.

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.