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

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

引言

在上几章的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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值