我想创建一个包含两个属性one
和two
的自定义QML组件,在未初始化时应具有默认值。特别是,如果two
应该获得一个取决于one
的初始值。以下代码
Rectangle {
property int one: 1
property int two: 2 * one
}
然后创建属性绑定:每当one
更改时,two
都会更新为新值2 * one
。如何在不创建绑定的情况下将two
初始化为2 * one
的值?
答案 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.onStatusChanged
和Component.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;
它可能看起来有点沉重,但如果你想一想,初始值就是你想要使用的东西,因此,属性的概念就是你真正想要的东西