Auf dieser Seite

Einbettung von C++-Objekten in QML mithilfe von Kontexteigenschaften

Warnung: Durch die Verwendung von Kontexteigenschaften in Ihrem QML-Code schaffen Sie eine Abhängigkeit Ihres QML-Codes von dem spezifischen Kontext, den Sie beim Schreiben im Sinn hatten. Dies schränkt die Wiederverwendbarkeit Ihres Codes ein, da der Kontext an anderen Stellen, an denen er möglicherweise verwendet wird, unterschiedlich sein kann. Darüber hinaus wird diese Abhängigkeit nicht deklariert. Sie geben den Kontext niemals mit „ import “ an oder legen auf andere Weise fest, was Sie erwarten. Daher wird es für jeden, der versucht, Ihren Code wiederzuverwenden, schwierig sein, herauszufinden, ob der Ort der Wiederverwendung über einen für Ihren Code ausreichenden Kontext verfügt.

Warnung: Kontexteigenschaften sind für alle Tools unsichtbar, die QML-Code vorab verarbeiten, bevor Sie ihn in die QML-Engine laden. Der „Qt Quick “-Compiler, qmllint und der QML Language Server wissen nichts über Ihre Kontexteigenschaften und betrachten jeden Zugriff auf Kontexteigenschaften als unqualifizierten Zugriff.

Hinweis: Kontexteigenschaften können im Allgemeinen entweder durch reguläre Eigenschaften am Stammobjekt 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 dann aus dem QML-Code heraus verwendet werden können. Dies ermöglicht es beispielsweise, eine C++-Methode auf dem eingebetteten Objekt aufzurufen oder eine C++-Objektinstanz als Datenmodell für eine QML-Ansicht zu verwenden.

Die Einbindung von C++-Daten in ein QML-Objekt wird durch die Klasse „ QQmlContext “ ermöglicht. Diese Klasse stellt Daten im Kontext eines QML-Objekts bereit, sodass direkt aus dem Geltungsbereich des QML-Codes auf die Daten verwiesen werden kann.

Festlegen einer einfachen Kontexteigenschaft

Hier ist beispielsweise ein QML-Element, das auf einen ` currentDateTime `-Wert verweist, der im aktuellen Geltungsbereich nicht existiert:

// MyItem.qml
import QtQuick

Text { text: currentDateTime }

Dieser ` currentDateTime `-Wert kann direkt von der C++-Anwendung, die die QML-Komponente lädt, mithilfe von ` 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 bei einer Änderung des Kontexts alle Bindungen in diesem Kontext neu ausgewertet. Daher sollten Kontexteigenschaften außerhalb der Anwendungsinitialisierung mit Bedacht eingesetzt werden, da dies zu einer verminderten Anwendungsleistung führen kann.

Ein Objekt als Kontexteigenschaft festlegen

Kontexteigenschaften können entweder Werte vom Typ ` QVariant ` oder ` QObject*` enthalten. Das bedeutet, dass auch benutzerdefinierte C++-Objekte auf diese Weise eingebunden werden können und diese Objekte direkt in QML geändert und ausgelesen werden können. Hier passen wir das obige Beispiel so an, dass anstelle eines ` QDateTime `-Werts eine ` QObject `-Instanz eingebettet wird, und der QML-Code ruft eine Methode 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 von C++ an QML zurückgegebene Datums-/Zeitwerte über ` Qt.formatDateTime()` und zugehörige Funktionen formatiert werden können.)

Wenn das QML-Element Signale von der Context-Eigenschaft empfangen soll, kann es diese mithilfe des Typs ` Connections ` verbinden. Wenn beispielsweise ` ApplicationData ` ein Signal namens ` dataChanged()` hat, kann dieses Signal mithilfe eines ` onDataChanged `-Handlers innerhalb eines ` Connections `-Objekts verbunden werden:

Text {
    text: applicationData.getCurrentDateTime()

    Connections {
        target: applicationData
        onDataChanged: console.log("The application data changed!")
    }
}

Weitere Informationen finden Sie auch in der Dokumentation zu „ QQmlContext “.

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