序言
记录下我学qml对于属性绑定的理解
一、属性“:”与“=”的区别
这两个对于属性的绑定是起根本作用的,要记得
直接上代码
Rectangle {
...
property int testWidth: 50
Button {
...
width: testWidth
onClicked: {
width = 100
}
}
...
}
注意上面的width,我分别对其进行“:” 和 “=”,在刚开始时,其是绑定了testWidth这个自定义属性值。
“:”
其会随着testWidth的变化而变化,这就是绑定,将width绑定了testWidth,testWidth即width。
“=”
其是将右值的结果值赋予左值(废话),但也会将width的绑定给破坏掉,使其以 = 赋值的数据保持静态,直到下一次对该width进行操作才会有所变化。
简单来说就是,**“=”**会解除左值的绑定,并将右值赋予左值作为解除之后的默认值。
诶,你以为看到这就以为都明白了?不,还有一个知识点。
二、绑定属性的变化原因
属性为什么会跟着绑定的属性变化呢?我相信如果我把源代码放上来的话,肯定会有一堆人跳过不想看(包括我),而直接去看结论,所以我就简单分析给你看,让你明白其原理。
首先,属性大多都有个on属性Changed
,这没有什么疑惑的吗?相信我这么一点你肯定就明白了。
width: 50
onWidthChanged: {
}
没错,大多的属性都有一个其的信号,所谓的绑定,可以说就是信号与槽的绑定。
以上面的width和testWidth为例,
当width和testWidth绑定时,是connect了testWidth的信号和width的槽。
testWidth改变时,会emit一个TestWidth信号,连接了其的TestWidth信号的属性即槽,会接受并因此而改变值。
当用“=”断开绑定时,是disconnect了testWidth的信号和width的槽。
如果还不相信的话,还有个简单的例子。
在用QML与C++混合编程时,注册C++对象时,要使用该对象的属性值。
即用Q_PROPERTY:
1、Q_PROPERTY(QColor backColor READ backColor WRITE setBackColor)
2、Q_PROPERTY(QColor backColor READ backColor WRITE setBackColor NOTIFY backColorChanged)
以上面两个为例,分别以“:”的方式绑定在QML的color属性上
Rectangle {
...
color: 对象名.backColor
MouseArea {
...
onClicked: {
对象名.backColor = Qt.rgba( 0.5, 0.5, 0.5, 1)
}
}
}
用第一种不含信号的属性值绑定成功后,点击改变backColor时,颜色并不会改变;
但是当使用第二种包含信号的属性值,在setBackColor函数里emit对应信号时,QML里的颜色也会随之改变。
什么?如果我定义一个TestWidth的属性值信号不是就用不了了吗?
对此我只能说,你试试看?属性值无法以大小开头作为定义名,这是规范。
如果有错望请包涵和指点错误,谢谢