C++-Objekte mit Kontexteigenschaften in QML einbetten
Warnung: Durch die Verwendung von Kontexteigenschaften in Ihrem QML-Code schaffen Sie eine Abhängigkeit zwischen Ihrem QML-Code und dem spezifischen Kontext, den Sie beim Schreiben im Sinn haben. Dies schränkt die Wiederverwendbarkeit Ihres Codes ein, da der Kontext an anderen Stellen, an denen er verwendet werden könnte, anders sein kann. Außerdem wird die Abhängigkeit nicht deklariert. Sie geben nie den Kontext import
an oder erklären auf andere Weise, was Sie erwarten. Daher wird jeder, der versucht, Ihren Code wiederzuverwenden, Schwierigkeiten haben herauszufinden, ob der Ort der Wiederverwendung einen ausreichenden Kontext für Ihren Code hat.
Warnung: Kontexteigenschaften sind für alle Werkzeuge, die QML-Code vor dem Laden in die QML-Engine verarbeiten, unsichtbar. Die Qt Quick Compiler, qmllint, und die QML Language Server wissen nichts über Ihre Kontexteigenschaften und betrachten jeden Zugriff auf Kontexteigenschaften als einen unqualifizierten Zugriff.
Hinweis: Kontexteigenschaften können im Allgemeinen entweder durch reguläre Eigenschaften des Wurzelobjekts einer Komponente oder durch Singletons ersetzt werden, die entweder in C++ mit QML_SINGLETON oder in QML mit pragma Singleton definiert werden.
Beim Laden eines QML-Objekts in eine C++-Anwendung kann es nützlich sein, einige C++-Daten direkt einzubetten, die aus dem QML-Code heraus verwendet werden können. Dadurch ist es zum Beispiel möglich, eine C++-Methode auf dem eingebetteten Objekt aufzurufen oder eine C++-Objektinstanz als Datenmodell für eine QML-Ansicht zu verwenden.
Die Fähigkeit, C++-Daten in ein QML-Objekt zu injizieren, wird durch die Klasse QQmlContext ermöglicht. Diese Klasse stellt Daten dem Kontext eines QML-Objekts zur Verfügung, so dass die Daten direkt aus dem Bereich des QML-Codes referenziert werden können.
Einstellen einer einfachen Kontexteigenschaft
Hier ein Beispiel für ein QML-Element, das auf einen currentDateTime
-Wert verweist, der im aktuellen Bereich nicht vorhanden ist:
// MyItem.qml import QtQuick Text { text: currentDateTime }
Dieser currentDateTime
-Wert kann direkt von der C++-Anwendung, die die QML-Komponente lädt, mit QQmlContext::setContextProperty() gesetzt werden:
QQuickView view; view.rootContext()->setContextProperty("currentDateTime", QDateTime::currentDateTime()); view.setSource(QUrl::fromLocalFile("MyItem.qml")); view.show();
Hinweis: Da alle in QML ausgewerteten Ausdrücke in einem bestimmten Kontext ausgewertet werden, werden alle Bindungen in diesem Kontext neu ausgewertet, wenn der Kontext geändert wird. Daher sollten Kontexteigenschaften außerhalb der Anwendungsinitialisierung mit Vorsicht verwendet werden, da dies zu einer verminderten Anwendungsleistung führen kann.
Festlegen eines Objekts als Kontexteigenschaft
Kontexteigenschaften können entweder QVariant oder QObject* Werte enthalten. Das bedeutet, dass auch benutzerdefinierte C++-Objekte mit diesem Ansatz injiziert werden können, und diese Objekte können direkt in QML geändert und gelesen werden. Hier wird das obige Beispiel geändert, um eine QObject Instanz anstelle eines QDateTime Wertes einzubetten, und der QML-Code ruft eine Methode auf der Objektinstanz auf:
C++ | class ApplicationData : public QObject { Q_OBJECT public: Q_INVOKABLE QDateTime getCurrentDateTime() const { return QDateTime::currentDateTime(); } }; int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); QQuickView view; ApplicationData data; view.rootContext()->setContextProperty("applicationData", &data); view.setSource(QUrl::fromLocalFile("MyItem.qml")); view.show(); return app.exec(); } |
QML | // MyItem.qml import QtQuick Text { text: applicationData.getCurrentDateTime() } |
(Beachten Sie, dass Datums-/Zeitwerte, die von C++ an QML zurückgegeben werden, durch Qt.formatDateTime() und zugehörige Funktionen formatiert werden können).
Wenn das QML-Element Signale von der Kontexteigenschaft empfangen muss, kann es sich mit ihnen über den Typ Connections verbinden. Wenn zum Beispiel ApplicationData
ein Signal mit dem Namen dataChanged()
hat, kann dieses Signal über einen onDataChanged
Handler innerhalb eines Connections Objekts verbunden werden:
Text { text: applicationData.getCurrentDateTime() Connections { target: applicationData onDataChanged: console.log("The application data changed!") } }
Kontexteigenschaften können für die Verwendung von C++-basierten Datenmodellen in einer QML-Ansicht nützlich sein. Siehe die folgenden Beispiele:
zur Demonstration der Verwendung von QStringList, QList<QObject*>-basierten Modellen und QAbstractItemModel in QML-Ansichten.
Weitere Informationen finden Sie auch in der Dokumentation QQmlContext.
© 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.