Freigabe des Zustands von C++ zu QML

Oft ist es wünschenswert, einige Eigenschaften von C++ für alle QML-Elemente in einer bestimmten Komponente, alle QML-Elemente in einem Modul oder sogar alle QML-Elemente insgesamt freizugeben. Dies kann durch die Einführung von Singletons oder durch das Hinzufügen von Eigenschaften zu den Stammobjekten ausgewählter Komponenten geschehen.

Singletons verwenden

Wenn Sie eine Reihe globaler Eigenschaften für alle Elemente in einem Modul oder für alle Elemente insgesamt freigeben möchten, können Sie in C++ ein Singleton definieren. Fügen Sie dazu die Makros QML_ELEMENT oder QML_NAMED_ELEMENT und das Makro QML_SINGLETON zu einer Klasse hinzu, die die Eigenschaften enthält, die Sie als Q_PROPERTY -Deklarationen zur Verfügung stellen 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, 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 gleichen Verzeichnis wie das Modul abgelegt haben (was sehr empfehlenswert ist), ist das Singleton über den impliziten Import innerhalb Ihres Moduls verfügbar. Sie brauchen es nicht explizit zu importieren. Andernfalls oder wenn Sie von anderen Modulen aus auf die Eigenschaft thing zugreifen wollen, müssen Sie das Modul, zu dem das Singleton gehört, importieren.

Um den Wert der Eigenschaft von C++ aus zu setzen, müssen Sie eventuell die Singleton-Instanz abrufen. Zu diesem Zweck können Sie QQmlEngine::singletonInstance verwenden. Der bevorzugte Weg, dies zu tun, ist die Angabe eines Moduls und eines Typnamens als Parameter:

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

Verwendung von Objekteigenschaften

Wenn Sie einige Eigenschaften nur den QML-Elementen in einer bestimmten Komponente zur Verfügung stellen wollen, können Sie sie als reguläre Eigenschaften zum Stammobjekt der Komponente hinzufügen. Um sicherzustellen, dass sie in jedem Fall gesetzt werden, können Sie sie zu erforderlichen Eigenschaften machen. 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 Wurzelelement der Komponente und referenzieren die Eigenschaft über ID und Name von allen inneren Objekten. Um die ID des Wurzelelements 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 sicherstellen, dass Sie QQmlComponent::createWithInitialProperties, QQmlApplicationEngine::setInitialProperties oder QQuickView::setInitialProperties aufrufen, um die Eigenschaften zu initialisieren. Ein Beispiel:

    QQmlEngine engine;

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

Dies setzt voraus, dass Ihr Modul-URI MyModule lautet und das Modul im QML-Importpfad verfügbar ist.

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