QML和C++混合编程–(三)之属性绑定
简介:
属性绑定是QML的一个强有力的特性,它使得各种类型的值被自动同步更新。它的更新机制是利用信号和槽。
示例:
让我们来绑定color属性。效果如下
单击后变为:
代码过程:
一、修改app.qml如下:
import Charts 1.0
import QtQuick 2.0
Item {
width: 300; height: 200
Row {
anchors.centerIn: parent
spacing: 20
PieChart {
id: chartA
width: 100; height: 100
color: "red"
}
PieChart {
id: chartB
width: 100; height: 100
color: chartA.color
}
}
MouseArea {
anchors.fill: parent
onClicked: { chartA.color = "blue" }
}
Text {
anchors { bottom: parent.bottom; horizontalCenter: parent.horizontalCenter; bottomMargin: 20 }
text: "Click anywhere to change the chart color"
}
}
“color: chartA.color” 绑定了chartB和chartA的color 值。 当chartA的color值改变时,chartB的color值会自动与chartA保持一致。
这里当我们单击窗体时,onClicked handler in the MouseArea 会触发改变chartA 的color,此时chartB 的颜色也会随之改变。
这里颜色属性的绑定非常简单。我们只需要在该Q_PROPERTY() 的声明中注明一个NOTIFY特性的信号"colorChanged"就可以了,那么已出发该信号就可以改变颜色的属性了。
class PieChart : public QQuickPaintedItem
{
...
Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged)
public:
...
signals:
void colorChanged();
...
};
然后,我们写一个函数setPieSlice()来触发一个colorChanged()信号:
void PieChart::setColor(const QColor &color)
{
if (color != m_color) {
m_color = color;
update(); // repaint with the new color
emit colorChanged();
}
}
这里我们在发送colorChanged()之前,先判断颜色是否变化。
总结:
QML的属性绑定是非常实用的。你只需要在信号前添加一个NOTIFY的声明就可以了。