如何避免在QML中初始化时创建属性绑定?

Tob*_*ias 10 qt qml

我想创建一个具有两个属性的自定义QML组件,one并且two在未初始化时应具有默认值.特别是,如果two应该得到一个初始值one.以下代码

Rectangle {
  property int one: 1
  property int two: 2 * one
}
Run Code Online (Sandbox Code Playgroud)

但是会创建一个属性绑定:每当one更改时,two都会更新为新值2 * one.如何在不创建绑定的情况下初始化two2 * one

小智 13

显式告知您不需要绑定的一种方法是在表达式块中调用赋值:

Rectangle {
  property int one: 1
  property int two: {two = 2 * one}
}
Run Code Online (Sandbox Code Playgroud)

与 onCompleted 中破坏绑定的方法不同,表达式块避免了绑定对象的创建和销毁,而且看起来更干净。


pix*_*ase 7

在组件完成时显式打破绑定:

Rectangle {
    property int one: 1
    property int two: 2 * one
    Component.onCompleted: two = two
}
Run Code Online (Sandbox Code Playgroud)

two = two分配断约束力,two不再更新one的变化。


Blu*_*gma -3

事实上,你不应该这样做。绑定是 QML 的基本行为,如果您试图避免它,那是因为您没有考虑好方法。

例如,如果属性二初始值是用属性一初始值计算的,而不是属性一值计算的,

那么这意味着您想要绑定初始值而不是,您应该创建一个只读属性,该属性的值将是属性一个初始值

readonly property int initialOne : 1;
property int one : initialOne;
property int two : 2 * initialOne;
Run Code Online (Sandbox Code Playgroud)

它可能看起来有点沉重,但如果你仔细想想,初始值就是你想要使用的,所以,属性的概念才是你真正想要的