Objektmodell
Das Standard-C++-Objektmodell bietet eine sehr effiziente Laufzeitunterstützung für das Objektparadigma. Aufgrund seines statischen Charakters ist es jedoch in bestimmten Problembereichen zu unflexibel. Die Programmierung grafischer Benutzeroberflächen ist ein Bereich, der 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 erweitert C++ um folgende Funktionen:
- einen sehr leistungsstarken Mechanismus für die nahtlose Objektkommunikation, der als „Signale und Slots“ bezeichnet wird
- abfragbare und gestaltbare Objekteigenschaften
- leistungsstarke Ereignisse und Ereignisfilter
- kontextbezogene Zeichenfolgenübersetzung für die Internationalisierung
- Ausgefeilte, intervallgesteuerte Timer, die es ermöglichen, zahlreiche Aufgaben elegant in eine ereignisgesteuerte GUI zu integrieren
- hierarchische und abfragbare Objektbäume, die die Objektzugehörigkeit auf natürliche Weise organisieren
- geschützte Zeiger (QPointer), die automatisch auf 0 gesetzt werden, wenn das referenzierte Objekt zerstört wird – im Gegensatz zu normalen C++-Zeigern, die zu „Dangling Pointern“ werden, wenn ihre Objekte zerstört werden
- ein dynamischer Typumwandlung, der bibliotheksübergreifend funktioniert.
- Unterstützung für die Erstellung benutzerdefinierter Typen.
Viele dieser Qt-Funktionen sind mit Standard-C++-Techniken implementiert, die auf der Vererbung von QObject basieren. Andere, wie der Objektkommunikationsmechanismus und das dynamische Eigenschaftssystem, erfordern das Meta-Objekt-System, das von Qt’s eigenem „Meta-Object Compiler “ (moc) bereitgestellt wird.
Das Metaobjektsystem ist eine C++-Erweiterung, die die Sprache besser für die echte komponentenbasierte GUI-Programmierung geeignet macht.
Wichtige Klassen
Diese Klassen bilden die Grundlage des Qt-Objektmodells.
Ermöglicht typunabhängigen Zugriff auf assoziative Container | |
Zusätzliche Informationen zu einer Klasse | |
Gemeinsame Funktionen für sequenzielle und assoziative Container | |
Metadaten zu einem Enumerator | |
Metadaten zu einer Mitgliedsfunktion | |
Enthält Metainformationen über Qt-Objekte | |
Metadaten zu einer Eigenschaft | |
Ermöglicht typunabhängigen Zugriff auf sequenzielle Container | |
Verwaltet benannte Typen im Metaobjektsystem | |
Die Basisklasse aller Qt-Objekte | |
Überwacht die Lebensdauer mehrerer QObjects | |
Template-Klasse, die geschützte Zeiger auf QObject bereitstellt | |
Ausnahsesicherer Wrapper um QObject::blockSignals() | |
Bündelt Signale von identifizierbaren Absendern | |
Fungiert wie eine Union für die gängigsten Qt-Datentypen |
Qt-Objekte: Identität vs. Wert
Einige der oben aufgeführten neuen 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 sehen vielleicht identisch aus, haben aber unterschiedliche Namen, unterschiedliche Wohnorte und möglicherweise völlig unterschiedliche soziale Netzwerke.
Das Klonen einer Identität ist also ein komplexerer Vorgang als das Kopieren oder Zuweisen eines Werts. Was das im Qt-Objektmodell bedeutet, lässt sich anhand eines Beispiels verdeutlichen.
Ein Qt-Objekt...
- kann eine eindeutige ` QObject::objectName()` haben. Wenn wir ein Qt-Objekt kopieren, welchen Namen sollten wir der Kopie geben?
- hat eine Position in einer Objekthierarchie. Wenn wir ein Qt-Objekt kopieren, wo soll die Kopie dann platziert werden?
- kann mit anderen Qt-Objekten verbunden werden, um Signale an diese zu senden oder von diesen gesendete Signale zu empfangen. Wenn wir ein Qt-Objekt kopieren, wie sollten wir diese Verbindungen auf die Kopie übertragen?
- Es können ihm zur Laufzeit neue Eigenschaften hinzugefügt werden, die nicht in der C++-Klasse deklariert sind. Wenn wir ein Qt-Objekt kopieren, sollte die Kopie dann 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 Werts. Daher ist bei ` QObject ` und allen (direkten oder indirekten) Unterklassen von ` QObject ` die Eigenschaft ` copy constructor and assignment operator ` deaktiviert.
© 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.