Synchronizer QML Type
同步两个或多个属性的值。更多
Import Statement: | import Qt.labs.synchronizer |
Since: | Qt 6.10 |
属性
- sourceObject : QtObject
- sourceProperty : string
- targetObject : QtObject
- targetProperty : string
信号
- valueBounced(QtObject object, string property)
- valueIgnored(QtObject object, string property)
详细说明
Synchronizer 对象将两个或多个属性绑定在一起,这样任何一个属性的更改都会自动更新所有其他属性。在此过程中,不会破坏任何一个属性的绑定。如果两个属性之间的数据流方向没有预先确定,则可以使用 Synchronizer。例如,TextInput 可以使用模型值进行初始化,但也应在编辑完成后更新模型值。
注: Qt Quick 和Qt 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
语法 - 填充
sourceObject
和sourceProperty
属性 - 填充
targetObject
和targetProperty
属性 - 在同步器的作用域中创建别名
下面的示例同步了四个不同的属性,使用了所有不同的选项:
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
,那么它将被用于初始化其他属性。 - 否则,如果分配给sourceObject 和sourceProperty 的值表示一个属性,该属性将被用作初始同步的源。
- 否则,如果使用
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 将同步的属性之一。
信号文档
如果property 的object 拒绝了在同步过程中设置其值的尝试,并产生了不同的值作为回应,则会发出该信号。这种被退回的值将被忽略,不会触发新一轮同步。
注: 相应的处理程序是onValueBounced
。
如果property 的object 没有响应作为同步一部分设置其值的尝试,则会发出此信号。
注: 相应的处理程序是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.