×
Namespaces

Variants
Actions

为在QML中使用的C++ 类添加属性绑定

From Nokia Developer Wiki
Jump to: navigation, search
Article Metadata

兼容于
平台:
Symbian

文章
hozhou 在 08 Mar 2011 创建
最后由 hamishwillee 在 13 Jun 2012 编辑

使用 QML 属性绑定

继续上一节(如何在QML中调用C++的方法并接收C++的信号)的内容,本节我们讨论如何为在QML中使用的C++ 类(PieChart)添加属性绑定。

属性绑定是QML的一个强大特性,它使得不同元素的值能够自动同步。当属性值发生改变的时候,它就用信号去通知并更新其他元素所使用的自身的值。

我们先为PieChart 的color属性添加属性绑定。于是我们在QML中就可以这样使用:

import Charts 1.0
import QtQuick 1.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 的color值和 chartA的color值绑定起来。在 MouseArea中的onClicked 处理函数中改变了chartA的颜色,于是也就把两个扇形图的颜色都设成了蓝色。

SimpleChart3.png

实现属性绑定

为color属性实现属性绑定是很容易的。我们给它的Q_PROPERTY()声明添加一个NOTIFY就可以了,这表明每当color的值发生变化的的时候,都会发出一个"colorChanged"信号。

class PieChart : public QDeclarativeItem
{
...
Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged)
public:
...
signals:
void colorChanged();
...
};

然后我们在setColor(const QColor &color) 里面发出这个信号:

void PieChart::setColor(const QColor &color)
{
if (color != m_color) {
m_color = color;
update(); // repaint with the new color
emit colorChanged();
}
}

在发出colorChanged()信号之前检查color的值是否真的发生了变化是很重要的。这避免了不必要的信号发送并且防止了循环(比如如果有其他元素也响应之一变化)。

在QML中使用绑定是很重要的。我们应当总是为可以实现的属性添加NOTIFY 信号,这样这个属性就可以使用绑定了。不能绑定的属性不能自动更新,在QML中也得不到灵活应用。并且由于在QML中绑定被频繁使用,如果你的自定义QML类型没有实现绑定的话使用它们的时候会觉得有些异常。


大家可以在 Qt 的 examples/declarative/tutorials/extending/chapter3-bindings 目录中找到本程序的完整代码。


相关链接

This page was last modified on 13 June 2012, at 13:59.
216 page views in the last 30 days.

Was this page helpful?

Your feedback about this content is important. Let us know what you think.

 

Thank you!

We appreciate your feedback.

×