×
Namespaces

Variants
Actions

在QML中使用自定义属性类型

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

代码示例
兼容于
平台:
Symbian

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

Contents

引言

在上几章的PieChart 类中,我们给它设置了两个属性,分别是name 和 color,其类型分别是QString 和QColor,这些都是QML内置所支持的类型。QML内置所支持的所有类型如下:

  • bool, unsigned int, int, float, double, qreal
  • QString, QUrl, QColor
  • QDate, QTime, QDateTime
  • QPoint, QPointF, QSize, QSizeF, QRect, QRectF
  • QVariant


自定义属性类型

如果我们想使用一个QML并不支持的类型,那么我们就需要向QML注册这个类型。 比如,我们现在使用一个新的名为pieSlice的属性替换掉之前使用的color属性,这个新的pieSlice属性的类型是"PieSlice",一种QML内置并不支持的类型。 于是我们就可以在QML中这样使用:

import Charts 1.0
import QtQuick 1.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)
}



下面我们来看一下如何实现pieSlice这个属性:

class PieChart : public QDeclarativeItem
{
Q_OBJECT
Q_PROPERTY(PieSlice* pieSlice READ pieSlice WRITE setPieSlice)
...
public:
...
PieSlice *pieSlice() const;
void setPieSlice(PieSlice *pieSlice);
...
};


PieSlice *PieChart::pieSlice() const
{
return m_pieSlice;
}
void PieChart::setPieSlice(PieSlice *pieSlice)
{
m_pieSlice = pieSlice;
pieSlice->setParentItem(this);
}

这里要注意的是,由于PieSlice是一个可见的Item,因此我们需要使用QDeclarativeItem::setParentItem(),把它注册成PieChart的孩子。于是当PieChart的内容需要绘制的时候,PieChart就会Paint它的这个孩子。



我们现在再来看一下PieSlice具体是如何实现的:

class PieSlice : public QDeclarativeItem
{
Q_OBJECT
Q_PROPERTY(QColor color READ color WRITE setColor)
 
public:
PieSlice(QDeclarativeItem *parent = 0);
 
QColor color() const;
void setColor(const QColor &color);
 
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0);
 
private:
QColor m_color;
};

和PieChart 一样,这个新的PieSlice类型也只从QDeclarativeItem继承下来的,并且使用Q_PROPERTY()来声明它的属性。




最后,我们需要使用qmlRegisterType() 把PieSlice 注册为QML可用的类型。由于 PieSlice 是和 PieChart 在一起的,因此我们把 PieSlice 也注册到 版本号为 1.0 的"Charts" 模块。

int main(int argc, char *argv[])
{
...
qmlRegisterType<PieSlice>("Charts", 1, 0, "PieSlice");
...
}

需要注意的是,如果是编译Desktop版本,请取消掉Qt Creator中的Shadow build选项。 整个工程的完整代码,请从下面的链接下载。


下载例程

Media:QMLCppProperty.zip

相关链接

This page was last modified on 13 June 2012, at 10:52.
119 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.

×