Objektmodell

Das Standardobjektmodell von C++ bietet eine sehr effiziente Laufzeitunterstützung für das Objektparadigma. Seine statische Natur ist jedoch in bestimmten Problemdomänen unflexibel. Die Programmierung grafischer Benutzeroberflächen ist eine Domäne, die sowohl Laufzeiteffizienz als auch ein hohes Maß an Flexibilität erfordert. Qt bietet dies, indem es die Geschwindigkeit von C++ mit der Flexibilität des Qt-Objektmodells kombiniert.

Qt ergänzt C++ um diese Eigenschaften:

Viele dieser Qt-Funktionen sind mit Standard-C++-Techniken implementiert, basierend auf der Vererbung von QObject. Andere, wie der Objektkommunikationsmechanismus und das dynamische Eigenschaftssystem, erfordern das Meta-Objektsystem, das von Qt's eigenem Meta-Object Compiler (moc) bereitgestellt wird.

Das Meta-Objektsystem ist eine C++-Erweiterung, die die Sprache besser für die GUI-Programmierung mit echten Komponenten geeignet macht.

Wichtige Klassen

Diese Klassen bilden die Grundlage des Qt-Objektmodells.

QMetaClassInfo

Zusätzliche Informationen über eine Klasse

QMetaContainer

Gemeinsame Funktionalität für sequentielle und assoziative Container

QMetaEnum

Metadaten über einen Enumerator

QMetaMethod

Metadaten über eine Memberfunktion

QMetaObject

Enthält Meta-Informationen über Qt-Objekte

QMetaProperty

Metadaten über eine Eigenschaft

QMetaSequence

Erlaubt den Zugriff auf sequentielle Container ohne Typangabe

QMetaType

Verwaltet benannte Typen im Meta-Objektsystem

QObject

Die Basisklasse für alle Qt-Objekte

QObjectCleanupHandler

Überwacht die Lebensdauer von mehreren QObjects

QPointer

Vorlagenklasse, die geschützte Zeiger auf QObject bereitstellt

QSignalBlocker

Ausnahmesicherer Wrapper um QObject::blockSignals()

QSignalMapper

Bündelt Signale von identifizierbaren Absendern

QVariant

Verhält sich wie eine Union für die gängigsten Qt-Datentypen

Qt-Objekte: Identität vs. Wert

Einige der oben aufgeführten zusätzlichen Funktionen des Qt-Objektmodells erfordern, dass wir Qt-Objekte als Identitäten und nicht als Werte betrachten. Werte werden kopiert oder zugewiesen, Identitäten werden geklont. Klonen bedeutet, eine neue Identität zu erstellen, nicht eine exakte Kopie der alten. Zum Beispiel haben Zwillinge unterschiedliche Identitäten. Sie können identisch aussehen, aber sie haben unterschiedliche Namen, unterschiedliche Orte und können völlig unterschiedliche soziale Netzwerke haben.

Das Klonen einer Identität ist also ein komplexerer Vorgang als das Kopieren oder Zuweisen eines Wertes. Wir können sehen, was dies im Qt-Objektmodell bedeutet.

Ein Qt-Objekt...

  • kann einen eindeutigen QObject::objectName() haben. Wenn wir ein Qt Object kopieren, welchen Namen sollten wir der Kopie geben?
  • hat eine Position in einer Objekthierarchie. Wenn wir ein Qt Object kopieren, wo soll die Kopie liegen?
  • kann mit anderen Qt-Objekten verbunden werden, um Signale an sie zu senden oder von ihnen Signale zu empfangen. Wenn wir ein Qt-Objekt kopieren, wie sollen wir diese Verbindungen auf die Kopie übertragen?
  • können zur Laufzeit neue Eigenschaften hinzugefügt werden, die nicht in der C++-Klasse deklariert sind. Wenn wir ein Qt-Objekt kopieren, sollte die Kopie die Eigenschaften enthalten, die dem Original hinzugefügt wurden?

Aus diesen Gründen sollten Qt-Objekte als Identitäten und nicht als Werte behandelt werden. Identitäten werden geklont, nicht kopiert oder zugewiesen, und das Klonen einer Identität ist ein komplexerer Vorgang als das Kopieren oder Zuweisen eines Wertes. Daher haben QObject und alle Unterklassen von QObject (direkt oder indirekt) ihre copy constructor and assignment operator deaktiviert.

© 2025 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.