C++&QML混合编程官方案例(四)

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");
      ...
  }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值