Synchronizer QML Type

Synchronisiert Werte zwischen zwei oder mehr Eigenschaften. Mehr...

Import Statement: import Qt.labs.synchronizer
Since: Qt 6.10

Eigenschaften

Signale

Ausführliche Beschreibung

Ein Synchronizer-Objekt bindet zwei oder mehr Eigenschaften aneinander, so dass eine Änderung an einer dieser Eigenschaften automatisch alle anderen aktualisiert. Dabei wird keine der Bindungen an einer der Eigenschaften unterbrochen. Sie können Synchronizer verwenden, wenn die Richtung des Datenflusses zwischen zwei Eigenschaften nicht im Voraus festgelegt ist. Zum Beispiel kann eine TextInput mit einem Modellwert initialisiert werden, sollte aber auch den Modellwert aktualisieren, wenn die Bearbeitung abgeschlossen ist.

Hinweis: Die von Qt Quick und Qt Quick Controls bereitgestellten Eingabeelemente lösen dieses Problem, indem sie Benutzerinteraktionssignale getrennt von Wertänderungssignalen bereitstellen und die Wertzuweisungen im C++-Code verstecken. Für ihre Interna benötigen Sie keinen Synchronizer. Er kann aber dennoch nützlich sein, wenn Sie ein Steuerelement mit einem Modell verbinden.

Betrachten Sie das folgende Beispiel.

Ohne Synchronizer

// MyCustomTextInput.qml
Item {
    property string text
    function append(characters: string) { text += characters }
    [...]
}

Sie könnten geneigt sein, die Eigenschaft text aus einem Modell zu füllen und das Modell zu aktualisieren, wenn das Signal textChanged empfangen wird.

// Does not work!
Item {
    id: root
    property string model: "lorem ipsum"
    MyCustomTextInput {
        text: root.model
        onTextChanged: root.model = text
    }
}

Dies funktioniert jedoch nicht. Wenn die Funktion append aufgerufen wird, wird die Eigenschaft text geändert und die Bindung, mit der sie über die Eigenschaft model aktualisiert wird, wird unterbrochen. Wenn model das nächste Mal aktualisiert wird, wird text nicht mehr aktualisiert.

Um dieses Problem zu lösen, können Sie die Bindung ganz weglassen und nur Signale für die Aktualisierung der beiden Eigenschaften verwenden. Auf diese Weise müssten Sie auf den Komfort von Bindungen verzichten.

Oder Sie können den Synchronizer verwenden.

Mit Synchronizer

Item {
    id: root
    property string model: "lorem ipsum"
    MyCustomTextInput {
        Synchronizer on text {
            property alias source: root.model
        }
    }
}

Synchronizer sorgt dafür, dass bei jeder Änderung des Modells oder des Textes auch die andere Eigenschaft aktualisiert wird.

Sie können die zu synchronisierenden Eigenschaften auf verschiedene Weise angeben:

  • Verwendung der Syntax on
  • Auffüllen der Eigenschaften sourceObject und sourceProperty
  • Auffüllen der Eigenschaften targetObject und targetProperty
  • Erstellen von Aliasen im Bereich des Synchronizers

Im folgenden Beispiel werden vier verschiedene Eigenschaften synchronisiert, wobei die verschiedenen Optionen genutzt werden:

Item {
    id: root
    property string model: "lorem ipsum"

    MyCustomTextInput {
        Synchronizer on text {
            sourceObject: other
            sourceProperty: "text"

            targetObject: root.children[0]
            targetProperty: "objectName"

            property alias source: root.model
            property alias another: root.objectName
        }
    }

    MyCustomTextInput {
        id: other
    }
}

Optional führt der Synchronizer eine erste Synchronisierung durch:

  • Wenn einer der Aliase source heißt, wird er zur Initialisierung der anderen Eigenschaften verwendet.
  • Andernfalls, wenn die Werte, die sourceObject und sourceProperty zugewiesen sind, eine Eigenschaft bezeichnen, wird diese Eigenschaft als Quelle für die anfängliche Synchronisierung verwendet.
  • Andernfalls, wenn die Syntax on verwendet wird, wird die Eigenschaft, für die der Synchronizer auf diese Weise erstellt wird, als Quelle für die anfängliche Synchronisierung verwendet.
  • Andernfalls wird keine Anfangssynchronisierung durchgeführt. Nur wenn sich eine der Eigenschaften ändert, werden die anderen aktualisiert.

Der Synchronizer entkoppelt sich automatisch. Während der Synchronisierung mit einem bestimmten Wert als Quelle akzeptiert er keine weiteren Aktualisierungen von einer der Eigenschaften, die als Ziel der Aktualisierung erwartet werden. Ein solches Verhalten würde sonst leicht zu unendlichen Aktualisierungsschleifen führen. Synchronizer verwendet das Signal valueBounced, um über diese Bedingung zu informieren. Darüber hinaus erkennt er Eigenschaften, die eine Aktualisierung stillschweigend verweigern, und gibt für sie das Signal valueIgnored aus. Stille wird in diesem Zusammenhang durch das Ausbleiben eines Änderungssignals nach dem Aufruf des Setters für die gegebene Eigenschaft bestimmt.

Wenn die zu synchronisierenden Eigenschaften von unterschiedlichem Typ sind, werden die üblichen QML-Typ-Zwänge angewendet.

Eigenschaft Dokumentation

sourceObject : QtObject

Diese Eigenschaft enthält den sourceObject-Teil des sourceObject/sourceProperty Paares, das zusammen eine der Eigenschaften angeben kann, die Synchronizer synchronisieren wird.


sourceProperty : string

Diese sourceProperty-Eigenschaft enthält den sourceProperty-Teil des sourceObject/sourceProperty-Paares, das zusammen eine der Eigenschaften angeben kann, die der Synchronizer synchronisieren wird.


targetObject : QtObject

Diese Eigenschaft enthält den targetObject-Teil des Paares targetObject/targetProperty, die zusammen eine der Eigenschaften angeben können, die der Synchronizer synchronisieren wird.


targetProperty : string

Diese targetProperty enthält den targetProperty-Teil des targetObject/targetProperty-Paares, die zusammen eine der Eigenschaften angeben können, die der Synchronizer synchronisieren wird.


Signal Dokumentation

valueBounced(QtObject object, string property)

Dieses Signal wird ausgegeben, wenn die property der object einen Versuch, ihren Wert als Teil der Synchronisation zu setzen, abgelehnt und als Antwort einen anderen Wert erzeugt hat. Solche abgelehnten Werte werden ignoriert und lösen keine weitere Synchronisationsrunde aus.

Hinweis: Der entsprechende Handler ist onValueBounced.


valueIgnored(QtObject object, string property)

Dieses Signal wird ausgegeben, wenn property der object nicht auf den Versuch reagiert hat, seinen Wert im Rahmen der Synchronisation zu setzen.

Hinweis: Der entsprechende Handler ist onValueIgnored.


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