Synchronizer QML Type

同步两个或多个属性的值。更多

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

属性

信号

详细说明

Synchronizer 对象将两个或多个属性绑定在一起,这样任何一个属性的更改都会自动更新所有其他属性。在此过程中,不会破坏任何一个属性的绑定。如果两个属性之间的数据流方向没有预先确定,则可以使用 Synchronizer。例如,TextInput 可以使用模型值进行初始化,但也应在编辑完成后更新模型值。

注: Qt QuickQt Quick Controls 提供的输入元素可解决这一问题,它们提供了与值更改信号分开的用户交互信号,并将值分配隐藏在 C++ 代码中。您需要使用 Synchronizer 来实现它们的内部功能。不过,在将控件连接到模型时,Synchronizer 可能仍然有用。

请看下面的示例。

不使用 Synchronizer

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

您可能倾向于从模型中填充text 属性,并在收到textChanged 信号时更新模型。

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

这样做是行不通的。当调用append 函数时,text 属性被修改,从model 属性更新该属性的绑定被破坏。下一次更新model 时,text 不再独立更新。

要解决这个问题,可以完全省略绑定,只使用信号来更新两个属性。这样就需要放弃绑定带来的便利。

或者,也可以使用 Synchronizer。

使用 Synchronizer

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

Synchronizer 可以确保每当模型或文本发生变化时,另一个也会随之更新。

你可以通过几种方式指定要同步的属性:

  • 使用on 语法
  • 填充sourceObjectsourceProperty 属性
  • 填充targetObjecttargetProperty 属性
  • 在同步器的作用域中创建别名

下面的示例同步了四个不同的属性,使用了所有不同的选项:

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
    }
}

作为选项,Synchronizer 将执行初始同步:

  • 如果其中一个别名被称为source ,那么它将被用于初始化其他属性。
  • 否则,如果分配给sourceObjectsourceProperty 的值表示一个属性,该属性将被用作初始同步的源。
  • 否则,如果使用on 语法,则以这种方式创建同步器的属性将被用作初始同步的源。
  • 否则将不执行初始同步。只有当其中一个属性发生变化时,其他属性才会更新。

同步器会自动去弹跳。在使用给定值作为源同步时,它不会接受来自预期更新目标属性的进一步更新。否则,这种行为很容易导致无限的更新循环。Synchronizer 使用valueBounced 信号来通知这种情况。此外,它还会检测那些默默拒绝更新的属性,并为它们发出valueIgnored 信号。在这种情况下,"静默 "是指在调用给定属性的设置器后没有变化信号。

如果要同步的属性是不同类型的,则会应用通常的 QML 类型强制。

属性文档

sourceObject : QtObject

该属性包含 sourceObject/sourceProperty 对中的 sourceObject 部分,它们可以一起指定 Synchronizer 将同步的属性之一。


sourceProperty : string

该 sourceProperty 包含sourceObject/sourceProperty 对中的 sourceProperty 部分,这两部分可共同指定 Synchronizer 将同步的属性之一。


targetObject : QtObject

该属性包含 targetObject/targetProperty 对中的 targetObject 部分,这些部分可共同指定 Synchronizer 将同步的属性之一。


targetProperty : string

该 targetProperty 包含targetObject/targetProperty 对中的 targetProperty 部分,它们可以共同指定 Synchronizer 将同步的属性之一。


信号文档

valueBounced(QtObject object, string property)

如果propertyobject 拒绝了在同步过程中设置其值的尝试,并产生了不同的值作为回应,则会发出该信号。这种被退回的值将被忽略,不会触发新一轮同步。

注: 相应的处理程序是onValueBounced


valueIgnored(QtObject object, string property)

如果propertyobject 没有响应作为同步一部分设置其值的尝试,则会发出此信号。

注: 相应的处理程序是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.