Auf dieser Seite

Zugriff auf den Zustand von C++ aus in QML

Häufig ist es wünschenswert, bestimmte Eigenschaften aus C++ für alle QML-Elemente einer bestimmten Komponente, alle QML-Elemente eines Moduls oder sogar für alle QML-Elemente insgesamt verfügbar zu machen. Dies können Sie erreichen, indem Sie Singletons einführen oder den Stammobjekten ausgewählter Komponenten Eigenschaften hinzufügen.

Verwendung von Singletons

Wenn Sie eine Reihe globaler Eigenschaften für alle Elemente in einem Modul oder für alle Elemente insgesamt verfügbar machen möchten, können Sie in C++ ein Singleton definieren. Fügen Sie dazu die Makros „ QML_ELEMENT “ oder „ QML_NAMED_ELEMENT “ sowie das Makro „QML_SINGLETON“ zu einer Klasse hinzu, die die Eigenschaften enthält, die Sie als „ Q_PROPERTY “-Deklarationen verfügbar machen möchten:

// Singleton.h
class Singleton : public QObject
{
    Q_OBJECT
    Q_PROPERTY(int thing READ thing WRITE setThing NOTIFY thingChanged FINAL)
    QML_ELEMENT
    QML_SINGLETON

public:
    Singleton(QObject *parent = nullptr) : QObject(parent) {}

    int thing() const { return m_value; }
    void setThing(int v)
    {
        if (v != m_value) {
            m_value = v;
            emit thingChanged();
        }
    }

signals:
    void thingChanged();

private:
    int m_value = 12;
};

Nun können Sie von jedem QML-Code aus, der dieses Modul importiert, auf die Eigenschaft `thing` des Singletons zugreifen:

import QtQml

QtObject {
    objectName: "The thing is " + Singleton.thing
}

Wenn Sie Ihre QML-Dateien im selben Verzeichnis wie das Modul abgelegt haben (was dringend empfohlen wird), ist das Singleton über den impliziten Import innerhalb Ihres Moduls verfügbar. Sie müssen nichts explizit importieren. Ist dies nicht der Fall oder möchten Sie von anderen Modulen aus auf die Eigenschaft `thing` zugreifen, müssen Sie das Modul importieren, zu dem das Singleton gehört.

Um den Wert der Eigenschaft aus C++ festzulegen, müssen Sie möglicherweise die Singleton-Instanz abrufen. Zu diesem Zweck können Sie ` QQmlEngine::singletonInstance` verwenden. Die bevorzugte Vorgehensweise hierfür ist die Übergabe eines Modul- und Typnamens als Parameter:

    Singleton *singleton
            = engine->singletonInstance<Singleton *>("MyModule", "Singleton");
    singleton->setThing(77);

Verwendung von Objekteigenschaften

Wenn Sie bestimmte Eigenschaften nur für die QML-Elemente einer bestimmten Komponente verfügbar machen möchten, können Sie diese als reguläre Eigenschaften zum Stammobjekt der Komponente hinzufügen. Um sicherzustellen, dass sie in allen Fällen tatsächlich gesetzt werden, können Sie sie als „Required Properties“ kennzeichnen. Sie könnten Ihre QML-Komponente wie folgt schreiben:

pragma ComponentBehavior: Bound

import QtQuick

Window {
    id: root
    visible: true

    required property int thing

    Text {
        anchors.fill: parent
        text: "The thing is " + root.thing
    }

    component Inner: QtObject {
        objectName: "I can see " + root.thing + " because I'm bound."
    }
}

Wir verwenden eine ID für das Stammelement der Komponente und referenzieren die Eigenschaft anhand der ID und des Namens von beliebigen inneren Objekten aus. Um die ID des Stammelements sicher für alle verschachtelten Komponenten verfügbar zu machen, verwenden wir `ComponentBehavior`.

Wenn Sie dann in C++ ein Objekt aus einer solchen Komponente erstellen, müssen Sie darauf achten, die Methoden ` QQmlComponent::createWithInitialProperties`, ` QQmlApplicationEngine::setInitialProperties` oder ` QQuickView::setInitialProperties ` aufzurufen, um die Eigenschaften zu initialisieren. Zum Beispiel:

    QQmlEngine engine;

    QQmlComponent component(&engine, "MyModule", "RequiredProperties");
    QScopedPointer<QObject> o(component.createWithInitialProperties({
            {"thing", 11}
    }));

Dabei wird davon ausgegangen, dass die URI Ihres Moduls „MyModule“ lautet und das Modul im QML-Importpfad verfügbar ist.

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