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

时间:2013-10-23 20:10:20

标签: qt qml

我想创建一个包含两个属性onetwo的自定义QML组件,在未初始化时应具有默认值。特别是,如果two应该获得一个取决于one的初始值。以下代码

Rectangle {
  property int one: 1
  property int two: 2 * one
}

然后创建属性绑定:每当one更改时,two都会更新为新值2 * one。如何在不创建绑定的情况下将two初始化为2 * one

4 个答案:

答案 0 :(得分:3)

在组件完成时显式中断绑定:

new String(byteArrayOs.toByteArray(), "utf8")

Rectangle { property int one: 1 property int two: 2 * one Component.onCompleted: two = two } 分配会破坏绑定,two = two不再更新为two更改。

答案 1 :(得分:2)

仔细检查是否需要绑定并注意不要使代码变脏 您可以很快填写物业价值,如下所示:

window {
    id: win
    width: 300; height: 450
    color: "#d8d8d8"
    Item {
        property int val1
        property int val2
        property int val3: parent.width    //<-- Binding
        Component.onCompleted: {
            val1 = win.width;    //<---|
            val2 = win.height;   //<---|=== There is no binding. Just changes value
            /* ... */
        }
    }
}

(我不确定,您可以使用Component.onStatusChangedComponent.Ready状态设置初始值)

性能提示:信号和Javascript代码会对性能产生一些影响。使用绑定可能更高效。使用Profiler来检查。如果您想设置多个属性的初始值,或者您已使用onCompleted信号,那么这将提高性能!

答案 2 :(得分:1)

一种明确表明您不希望绑定的方法是在表达式块中调用赋值:

Rectangle {
  property int one: 1
  property int two: {two = 2 * one}
}

与在onCompleted中断开绑定的方法不同,表达式块避免了创建绑定对象并随后对其进行销毁,并且看上去更加简洁。

答案 3 :(得分:-1)

事实上,你不应该。绑定是QML的基本行为,如果你试图避免它,那就是因为你没有想到好的方法。

例如,如果属性两个初始值使用属性计算一个初始值但不计算属性一个值

那么这意味着你要绑定初始值而非,你应该创建一个只读属性,其值将是属性一个初始值

readonly property int initialOne : 1;
property int one : initialOne;
property int two : 2 * initialOne;

它可能看起来有点沉重,但如果你想一想,初始值就是你想要使用的东西,因此,属性的概念就是你真正想要的东西