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:
- einen sehr leistungsfähigen Mechanismus für nahtlose Objektkommunikation, genannt Signale und Slots
- abfragbare und gestaltbare Objekteigenschaften
- leistungsfähige Ereignisse und Ereignisfilter
- kontextbezogene String-Übersetzung für die Internationalisierung
- ausgefeilte intervallgesteuerte Timer, die es ermöglichen, viele Aufgaben elegant in eine ereignisgesteuerte GUI zu integrieren
- hierarchische und abfragbare Objektbäume, die Objektbesitz 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 baumelnden Zeigern werden, wenn ihre Objekte zerstört werden
- ein dynamischer Cast, der über Bibliotheksgrenzen hinweg funktioniert.
- Unterstützung für die Erstellung benutzerdefinierter Typen.
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.
Zusätzliche Informationen über eine Klasse | |
Gemeinsame Funktionalität für sequentielle und assoziative Container | |
Metadaten über einen Enumerator | |
Metadaten über eine Memberfunktion | |
Enthält Meta-Informationen über Qt-Objekte | |
Metadaten über eine Eigenschaft | |
Erlaubt den Zugriff auf sequentielle Container ohne Typangabe | |
Verwaltet benannte Typen im Meta-Objektsystem | |
Die Basisklasse für alle Qt-Objekte | |
Überwacht die Lebensdauer von mehreren QObjects | |
Vorlagenklasse, die geschützte Zeiger auf QObject bereitstellt | |
Ausnahmesicherer Wrapper um QObject::blockSignals() | |
Bündelt Signale von identifizierbaren Absendern | |
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.