Chapter 4: Using Custom Property Types(章节四:使用自定义类型)
extending-qml/chapter4-customPropertyTypes
Piechart类型当前有一个字符串类型属性和一个颜色类型属性。它可以有许多其他类型的属性。例如,它可以有一个int-type属性来存储每个图表的标识符:
// C++
class PieChart : public QQuickPaintedItem
{
Q_PROPERTY(int chartId READ chartId WRITE setChartId NOTIFY chartIdChanged)
...
public:
void setChartId(int chartId);
int chartId() const;
...
signals:
void chartIdChanged();
};
// QML
PieChart {
...
chartId: 100
}
除了int之外,我们还可以使用各种其他属性类型。QML自动支持许多Qt数据类型,如QColor、QSize和QRect。
如果要创建默认情况下QML不支持其类型的属性,则需要向QML引擎注册该类型。例如,让我们将该属性的使用替换为具有颜色属性的名为“PieSlice”的类型。我们不指定颜色,而是指定一个本身包含颜色的PieSlice值:
import Charts 1.0
import QtQuick 2.0
Item {
width: 300; height: 200
PieChart {
id: chart
anchors.centerIn: parent
width: 100; height: 100
pieSlice: PieSlice {
anchors.fill: parent
color: "red"
}
}
Component.onCompleted: console.log("The pie is colored " + chart.pieSlice.color)
}
与PieChart类似,这个新的PieSlice类型继承自QQuickPaintedItem,并使用Q_Property()声明其属性:
class PieSlice : public QQuickPaintedItem
{
Q_OBJECT
Q_PROPERTY(QColor color READ color WRITE setColor)
public:
PieSlice(QQuickItem *parent = 0);
QColor color() const;
void setColor(const QColor &color);
void paint(QPainter *painter);
private:
QColor m_color;
};
要在PieChart中使用它,我们修改颜色属性声明和相关的方法签名:
class PieChart : public QQuickItem
{
Q_OBJECT
Q_PROPERTY(PieSlice* pieSlice READ pieSlice WRITE setPieSlice)
...
public:
...
PieSlice *pieSlice() const;
void setPieSlice(PieSlice *pieSlice);
...
};
在实现setPieSlice()时需要注意一件事。PieSlice是可视项目,因此必须使用QQuickItem::setParentItem()将其设置为Piehart的子项,以便PieChart知道在绘制其内容时绘制此子项目:
void PieChart::setPieSlice(PieSlice *pieSlice)
{
m_pieSlice = pieSlice;
pieSlice->setParentItem(this);
}
与PieChart类型类似,PieSlice类型必须使用从QML使用的qmlRegisterType()进行注册。与PieChart一样,我们将把该类型添加到1.0版的“Charts”类型命名空间中:
int main(int argc, char *argv[])
{
...
qmlRegisterType<PieSlice>("Charts", 1, 0, "PieSlice");
...
}