Überblick - QML und C++-Integration
QML ist so konzipiert, dass es durch C++-Code leicht erweiterbar ist. Die Klassen im Qt Qml Modul ermöglichen es, QML-Objekte von C++ aus zu laden und zu manipulieren, und die Art der Integration der QML-Engine in das Meta-Objektsystem von Qt ermöglicht es, C++-Funktionen direkt von QML aus aufzurufen. Dies ermöglicht die Entwicklung hybrider Anwendungen, die mit einer Mischung aus QML, JavaScript und C++-Code implementiert werden.
Die Integration von QML und C++ bietet eine Vielzahl von Möglichkeiten, darunter die folgenden
- Trennen des Codes für die Benutzeroberfläche vom Code für die Anwendungslogik, indem ersterer mit QML und JavaScript innerhalb von QML-Dokumenten und letzterer mit C++ implementiert wird
- Verwendung und Aufruf einiger C++-Funktionen aus QML (z. B. zum Aufrufen Ihrer Anwendungslogik, zur Verwendung eines in C++ implementierten Datenmodells oder zum Aufrufen einiger Funktionen in einer C++-Bibliothek eines Drittanbieters)
- Zugriff auf Funktionalität in der Qt Qml oder Qt Quick C++-API (z. B. zur dynamischen Erzeugung von Bildern mit QQuickImageProvider)
- Ihre eigenen QML-Objekttypen in C++ zu implementieren - sei es zur Verwendung innerhalb Ihrer eigenen Anwendung oder zur Weitergabe an andere
Um QML einige C++-Daten oder -Funktionen zur Verfügung zu stellen, müssen diese von einer QObject-abgeleiteten Klasse bereitgestellt werden. Aufgrund der Integration der QML-Engine mit dem Meta-Objektsystem sind die Eigenschaften, Methoden und Signale jeder von QObject abgeleiteten Klasse von QML aus zugänglich, wie in Attribute von C++-Typen für QML verfügbar machen beschrieben. Sobald die erforderliche Funktionalität von einer solchen Klasse bereitgestellt wird, kann sie auf verschiedene Weise für QML zugänglich gemacht werden:
- Die Klasse kann als instanzierbarer QML-Typ registriert werden, so dass sie wie jeder gewöhnliche QML-Objekttyp in QML-Code instanziert und verwendet werden kann.
- Die Klasse kann als Singleton-Typ registriert werden, so dass eine einzelne Instanz der Klasse aus QML-Code importiert werden kann, so dass auf die Eigenschaften, Methoden und Signale der Instanz von QML aus zugegriffen werden kann
- Eine Instanz der Klasse kann als Kontexteigenschaft oder Kontextobjekt in QML-Code eingebettet werden, so dass der Zugriff auf die Eigenschaften, Methoden und Signale der Instanz von QML aus möglich ist.
Dies sind die gebräuchlichsten Methoden, um von QML-Code aus auf C++-Funktionen zuzugreifen; weitere Optionen und Details finden Sie auf den Hauptseiten der Dokumentation, die in den folgenden Abschnitten beschrieben werden. Abgesehen von der Möglichkeit, von QML aus auf C++-Funktionen zuzugreifen, bietet das Qt Qml Modul auch die umgekehrte Möglichkeit, QML-Objekte von C++-Code aus zu manipulieren. Siehe Interaktion mit QML-Objekten von C++ aus für weitere Details.
Oft ist es wünschenswert, einige Zustände als globale Eigenschaften für QML freizugeben. Wie das geht, wird in Exposing State from C++ to QML beschrieben.
Schließlich kann der C++-Code entweder in eine C++-Anwendung oder in ein C++-Plugin integriert werden, je nachdem, ob er als eigenständige Anwendung oder als Bibliothek verteilt werden soll. Ein Plugin kann in ein QML-Modul integriert werden, das dann von QML-Code in anderen Anwendungen importiert und verwendet werden kann; weitere Informationen finden Sie unter Bereitstellen von Typen und Funktionalität in einem C++-Plugin.
Auswahl der richtigen Integrationsmethode zwischen C++ und QML
Um schnell festzustellen, welche Integrationsmethode für Ihre Situation geeignet ist, kann das folgende Flussdiagramm verwendet werden:
Eine Beschreibung der Makros im Flussdiagramm finden Sie in der Dokumentation Defining QML Types from C++.
Attribute von C++-Klassen für QML verfügbar machen
QML kann dank der Integration der QML-Engine in das Qt-Metaobjektsystem leicht von C++ aus erweitert werden. Durch diese Integration können die Eigenschaften, Methoden und Signale jeder von QObject abgeleiteten Klasse von QML aus zugänglich gemacht werden: Eigenschaften können gelesen und geändert werden, Methoden können von JavaScript-Ausdrücken aus aufgerufen werden und Signalhandler werden bei Bedarf automatisch für Signale erstellt. Darüber hinaus sind Aufzählungswerte einer QObject-abgeleiteten Klasse von QML aus zugänglich.
Weitere Informationen finden Sie unter Attribute von C++-Typen für QML verfügbar machen.
Definieren von QML-Typen aus C++
QML-Typen können in C++ definiert und dann im QML-Typsystem registriert werden. Dadurch kann eine C++-Klasse als QML-Objekttyp instanziiert werden, so dass benutzerdefinierte Objekttypen in C++ implementiert und in bestehenden QML-Code integriert werden können. Eine C++-Klasse kann auch für andere Zwecke registriert werden: Sie kann beispielsweise als Singleton-Typ registriert werden, damit eine einzelne Klasseninstanz von QML-Code importiert werden kann, oder sie kann registriert werden, damit die Aufzählungswerte einer nicht instanzierbaren Klasse von QML aus zugänglich sind.
Zusätzlich bietet das Qt Qml Modul bietet außerdem Mechanismen zur Definition von QML-Typen, die sich in QML-Konzepte wie angehängte Eigenschaften und Standardeigenschaften integrieren lassen.
Weitere Informationen zur Registrierung und Erstellung von benutzerdefinierten QML-Typen aus C++ finden Sie in der Dokumentation Defining QML Types from C++.
Einbettung von C++-Objekten in QML mit Kontexteigenschaften
C++-Objekte und -Werte können mit Hilfe von Kontexteigenschaften und Kontextobjekten direkt in den Kontext (oder Scope) von geladenen QML-Objekten eingebettet werden. Dies wird durch die QQmlContext Klasse erreicht, die durch das Qt Qml zur Verfügung gestellte Klasse , die Daten dem Kontext einer QML-Komponente zur Verfügung stellt, so dass Daten aus C++ in QML injiziert werden können.
Weitere Informationen finden Sie unter Einbetten von C++-Objekten in QML mit Kontexteigenschaften.
Interaktion mit QML-Objekten aus C++
QML-Objekttypen können von C++ aus instanziiert und inspiziert werden, um auf ihre Eigenschaften zuzugreifen, ihre Methoden aufzurufen und ihre Signalbenachrichtigungen zu empfangen. Dies ist möglich, da alle QML-Objekttypen unter Verwendung von QObject-abgeleiteten Klassen implementiert sind, wodurch die QML-Engine in die Lage versetzt wird, Objekte über das Qt-Metaobjektsystem dynamisch zu laden und zu untersuchen.
Warnung: Obwohl es möglich ist, auf QML-Objekte von C++ aus zuzugreifen und sie zu manipulieren, ist dies nicht der empfohlene Ansatz, außer für Test- und Prototyping-Zwecke. Eine der Stärken der Integration von QML und C++ ist die Möglichkeit, Benutzeroberflächen in QML getrennt von der C++-Logik und dem Datensatz-Backend zu implementieren, was nicht möglich ist, wenn die C++-Seite QML direkt manipuliert. Ein solcher Ansatz erschwert auch die Änderung der QML-Benutzeroberfläche ohne Auswirkungen auf das C++-Gegenstück.
Weitere Informationen über den Zugriff auf QML-Objekte von C++ aus finden Sie in der Dokumentation über die Interaktion mit QML-Objekten von C++ aus und im Abschnitt Daten von C++ nach QML freigeben auf der Seite Best Practices.
Datentypkonvertierung zwischen QML und C++
Wenn Datenwerte zwischen QML und C++ ausgetauscht werden, werden sie von der QML-Engine so konvertiert, dass sie die korrekten Datentypen haben, die für die Verwendung von QML oder C++ geeignet sind, vorausgesetzt, die betreffenden Datentypen sind der Engine bekannt.
Siehe Datentypkonvertierung zwischen QML und C++ für Informationen über die eingebauten Typen, die von der Engine unterstützt werden und wie diese Typen für die Verwendung beim Austausch zwischen QML und C++ konvertiert werden.
© 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.