Auf dieser Seite

Übersicht – Integration von QML und C++

QML ist so konzipiert, dass es sich leicht durch C++-Code erweitern lässt. Die Klassen im Qt Qml Modul ermöglichen es, QML-Objekte aus C++ zu laden und zu bearbeiten, und dank der Integration der QML-Engine in das Metobjektsystem von Qt können C++-Funktionen direkt aus QML aufgerufen werden. Dies ermöglicht die Entwicklung von Hybridanwendungen, die mit einer Mischung aus QML-, JavaScript- und C++-Code implementiert sind.

Die Integration von QML und C++ bietet eine Vielzahl von Möglichkeiten, darunter die Fähigkeit:

  • den Code der Benutzeroberfläche vom Code der Anwendungslogik zu trennen, indem ersterer mit QML und JavaScript in QML-Dokumenten und letzterer mit C++ implementiert wird
  • Verwendung und Aufruf bestimmter C++-Funktionen aus QML heraus (beispielsweise zum Aufrufen Ihrer Anwendungslogik, zur Nutzung eines in C++ implementierten Datenmodells oder zum Aufruf bestimmter Funktionen in einer C++-Bibliothek eines Drittanbieters)
  • Zugriff auf Funktionen in der Qt Qml oder Qt Quick C++-API zu nutzen (beispielsweise zur dynamischen Erzeugung von Bildern mithilfe von ` QQuickImageProvider`)
  • Implementieren Sie Ihre eigenen QML-Objekttypen aus C++ – sei es zur Verwendung in Ihrer eigenen spezifischen Anwendung oder zur Weitergabe an andere

Um QML C++-Daten oder -Funktionalitäten zur Verfügung zu stellen, müssen diese über eine von ` QObject` abgeleitete Klasse bereitgestellt werden. Aufgrund der Integration der QML-Engine in das Metaobjektsystem sind die Eigenschaften, Methoden und Signale jeder von ` QObject` abgeleiteten Klasse von QML aus zugänglich, wie unter „Bereitstellung von Attributen von C++-Typen für QML“ beschrieben. Sobald die erforderliche Funktionalität von einer solchen Klasse bereitgestellt wird, kann sie auf verschiedene Weise für QML verfügbar gemacht werden:

  • Die Klasse kann als instanziierbarer QML-Typ registriert werden, sodass sie wie jeder gewöhnliche QML-Objekttyp aus QML-Code instanziiert und verwendet werden kann
  • Die Klasse kann als Singleton-Typ registriert werden, sodass eine einzelne Instanz der Klasse aus QML-Code importiert werden kann, wodurch der Zugriff auf die Eigenschaften, Methoden und Signale der Instanz aus QML möglich ist

Dies sind die gängigsten Methoden, um aus QML-Code auf C++-Funktionalität zuzugreifen. Die „ QML Type Registration Macros “ bieten eine Reihe weiterer Optionen und Varianten. Darüber hinaus bietet das Modul neben der Möglichkeit, aus QML auf C++-Funktionalität zuzugreifen, Qt Qml Modul Möglichkeiten, den umgekehrten Weg zu gehen und QML-Objekte aus C++-Code heraus zu manipulieren. Weitere Details finden Sie unter „Interaktion mit QML-Objekten aus C++ “.

Häufig ist es wünschenswert, bestimmte Zustände als globale Eigenschaften für QML zugänglich zu machen. In „Zustände von C++ für QML verfügbar machen “ wird beschrieben, wie dies erfolgt.

Der C++-Code kann entweder in eine C++-Anwendung oder in ein eigenständiges QML-Modul integriert werden, je nachdem, ob er als eigenständige Anwendung oder als Bibliothek verteilt werden soll. Ein QML-Modul kann ein C++-Plugin enthalten, das dann von der QML-Engine dynamisch geladen werden kann. Dadurch kann eine Anwendung QML-Module nutzen, die nicht in die Binärdatei eingebunden wurden.

Sie können eigenständige Plugins auch manuell erstellen. Weitere Informationen finden Sie unter „Bereitstellung von Typen und Funktionalität in einem C++-Plugin “. Dies wird jedoch nicht empfohlen.

Schließlich kann eine Instanz der Klasse als Kontexteigenschaft oder Kontext-Objekt in QML-Code eingebettet werden, wodurch von QML aus auf die Eigenschaften, Methoden und Signale der Instanz zugegriffen werden kann. Kontexteigenschaften sollten vermieden werden.

Auswahl der richtigen Integrationsmethode zwischen C++ und QML

Um schnell zu ermitteln, welche Integrationsmethode für Ihre Situation geeignet ist, können Sie das folgende Flussdiagramm verwenden:

Das Flussdiagramm hilft dem Benutzer bei der Auswahl der richtigen Integration

Eine Beschreibung der Makros im Flussdiagramm finden Sie in der Dokumentation „QML-Typen aus C++ definieren “.

Bereitstellung von Attributen von C++-Klassen für QML

QML lässt sich dank der Integration der QML-Engine in das Qt-Metaobjektsystem problemlos aus C++ heraus erweitern. Diese Integration ermöglicht den Zugriff auf die Eigenschaften, Methoden und Signale jeder von ` QObject` abgeleiteten Klasse aus QML: Eigenschaften können gelesen und geändert werden, Methoden können über JavaScript-Ausdrücke aufgerufen werden und Signal-Handler werden bei Bedarf automatisch für Signale erstellt. Zudem sind die Aufzählungswerte einer von ` QObject` abgeleiteten Klasse von QML aus zugänglich.

Weitere Informationen finden Sie unter „Exposing Attributes of C++ Types to QML “.

Definition von QML-Typen aus C++

QML-Typen können in C++ definiert und anschließend im QML-Typensystem registriert werden. Dadurch kann eine C++-Klasse als QML-Objekttyp instanziiert werden, was die Implementierung benutzerdefinierter Objekttypen in C++ und deren Integration in bestehenden QML-Code ermöglicht. Eine C++-Klasse kann auch für andere Zwecke registriert werden: Sie könnte beispielsweise als Singleton-Typ registriert werden, um den Import einer einzelnen Klasseninstanz durch QML-Code zu ermöglichen, oder sie könnte registriert werden, um den Zugriff auf die Aufzählungswerte einer nicht instanziierbaren Klasse aus QML heraus zu ermöglichen.

Darüber hinaus bietet das Qt Qml Modul Mechanismen zur Definition von QML-Typen bereit, die sich in QML-Konzepte wie „attached properties“ und „default properties“ integrieren lassen.

Weitere Informationen zum Registrieren und Erstellen benutzerdefinierter QML-Typen aus C++ finden Sie in der Dokumentation „Definieren von QML-Typen aus C++ “.

Einbetten von C++-Objekten in QML mit Kontexteigenschaften

C++-Objekte und -Werte können mithilfe von Kontext-Eigenschaften und Kontext-Objekten direkt in den Kontext (oder Geltungsbereich) geladener QML-Objekte eingebettet werden. Dies wird durch die Klasse ` QQmlContext ` erreicht, die vom Qt Qml Modul bereitgestellt wird. Diese macht Daten für den Kontext einer QML-Komponente zugänglich und ermöglicht so die Einbindung von Daten aus C++ in QML.

Weitere Informationen finden Sie unter „Einbetten von C++-Objekten in QML mithilfe von Kontexteigenschaften “.

Interaktion mit QML-Objekten aus C++

QML-Objekttypen können von C++ aus instanziiert und untersucht werden, um auf ihre Eigenschaften zuzugreifen, ihre Methoden aufzurufen und ihre Signalbenachrichtigungen zu empfangen. Dies ist möglich, da alle QML-Objekttypen mithilfe von von ` QObject` abgeleiteten Klassen implementiert sind, was es der QML-Engine ermöglicht, Objekte über das Qt-Metaobjektsystem dynamisch zu laden und zu untersuchen.

Warnung: Obwohl es möglich ist, von C++ aus auf QML-Objekte zuzugreifen und diese zu bearbeiten, wird dieser Ansatz – außer zu Test- und Prototyping-Zwecken – nicht empfohlen. Eine der Stärken der QML- und C++-Integration ist die Möglichkeit, Benutzeroberflächen in QML getrennt von der C++-Logik und dem Daten-Backend zu implementieren; dies scheitert jedoch, wenn die C++-Seite beginnt, QML direkt zu manipulieren. Ein solcher Ansatz erschwert zudem die Änderung der QML-Benutzeroberfläche, ohne dass dies Auswirkungen auf das entsprechende C++-Gegenstück hat.

Weitere Informationen zum Zugriff auf QML-Objekte aus C++ finden Sie in der Dokumentation unter „Interaktion mit QML-Objekten aus C++“ sowie im Abschnitt „Bereitstellung von Daten aus C++ für QML “ 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 richtigen Datentypen aufweisen, die für die Verwendung in QML oder C++ geeignet sind, sofern die beteiligten Datentypen der Engine bekannt sind.

Informationen zu den von der Engine unterstützten integrierten Typen und dazu, wie diese Typen beim Austausch zwischen QML und C++ konvertiert werden, finden Sie unter „Datentypkonvertierung zwischen QML und C++ “.

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