一、效果展示

  本篇文章还是带来一个简单的qt示例分析,且看图1效果。

图1 贝塞尔曲线

二、源码分析

  该示例代码所在目录quick\scenegraph\customgeometry,感兴趣的同学可以自己去找,这篇文章我还是主要讲解源码,不涉及其他方面。

  废话不多述,下面开始源码剖析。本篇讲解的示例看似简单,却是在C++和qml之间的一座桥梁,他告诉我们C++和qml是怎么混合编程的,在这篇文章中有几个重要的函数或者宏,例如:qmlRegisterType、Q_PROPERTY。

  1、main文件

 1 int main(int argc, char **argv)
 2 {
 3     QGuiApplication app(argc, argv);
 4
 5     qmlRegisterType<BezierCurve>("CustomGeometry", 1, 0, "BezierCurve");//注册自定义Quick控件到qml系统环境中
 6
 7     QQuickView view;
 8     QSurfaceFormat format = view.format();
 9     format.setSamples(16);
10     view.setFormat(format);
11     view.setSource(QUrl("qrc:///scenegraph/customgeometry/main.qml"));
12     view.show();
13
14     app.exec();
15 }

  上述代码第5行使用了qmlRegisterType函数将C++中自定义的QQuickItem类型注册到qml环境中,4个参数分别是:包名、主版本号、子版本号和控件名称

  qml文件可以通过QQuickView对象来加载,并展示。参考Qml文件的两种加载方式|启动Qt quick app的两种方法

  2、自定义QQuickItem类型

 1 class BezierCurve : public QQuickItem
 2 {
 3     Q_OBJECT
 4
 5     Q_PROPERTY(QPointF p1 READ p1 WRITE setP1 NOTIFY p1Changed)//使用Q_PROPERTY进行声明的宏可以通过属性系统进行操作,例如qss中qproperty-p1:1,1  qml中p1: Qt.point(0, 1)
 6     Q_PROPERTY(QPointF p2 READ p2 WRITE setP2 NOTIFY p2Changed)
 7     Q_PROPERTY(QPointF p3 READ p3 WRITE setP3 NOTIFY p3Changed)
 8     Q_PROPERTY(QPointF p4 READ p4 WRITE setP4 NOTIFY p4Changed)
 9
10     Q_PROPERTY(int segmentCount READ segmentCount WRITE setSegmentCount NOTIFY segmentCountChanged)//WRITE操作之后,发生NOTIFY指定的信号
11
12 public:
13     BezierCurve(QQuickItem *parent = 0);
14     ~BezierCurve();
15
16 //! [2]
17     QSGNode *updatePaintNode(QSGNode *, UpdatePaintNodeData *);//qml文件中通过SequentialAnimation动画修改p2和p3的值,并触发update函数
18 //! [2]
19
20     QPointF p1() const { return m_p1; }
21     QPointF p2() const { return m_p2; }
22     QPointF p3() const { return m_p3; }
23     QPointF p4() const { return m_p4; }
24
25     int segmentCount() const { return m_segmentCount; }
26
27     void setP1(const QPointF &p);
28     void setP2(const QPointF &p);
29     void setP3(const QPointF &p);
30     void setP4(const QPointF &p);
31
32     void setSegmentCount(int count);
33
34 signals:
35     void p1Changed(const QPointF &p);
36     void p2Changed(const QPointF &p);
37     void p3Changed(const QPointF &p);
38     void p4Changed(const QPointF &p);
39
40     void segmentCountChanged(int count);
41
42 private:
43     QPointF m_p1;
44     QPointF m_p2;
45     QPointF m_p3;
46     QPointF m_p4;
47
48     int m_segmentCount;
49 };

  自定义QQuickItem类型头文件函数中第5-8行都使用了Q_PROPERTY宏,该宏的作用是成员p可以用个p接口访问、通过setP接口设置,当成员p发生变化的时候会有pChanged信号发出。访问接口在头文件中已经实现,下边我们看一个设置接口的实现

1 void BezierCurve::setP1(const QPointF &p)
2 {
3     if (p == m_p1)
4         return;
5
6     m_p1 = p;
7     emit p1Changed(p);
8     update();
9 }

  设置接口也相对简单,当调用该接口的时候,发出指定信号。

  3、qml文件中使用自定义类型

 1 import QtQuick 2.0
 2 import CustomGeometry 1.0 //导入自定义包
 3 //! [1] //! [2]
 4 Item {
 5     width: 300
 6     height: 200
 7
 8     BezierCurve {//直接使用控件名称   导入方式也可以改为import CustomGeometry 1.0 as MyCustom,那么控件使用方式改为MyCustom.BezierCurve
 9         id: line
10         anchors.fill: parent
11         anchors.margins: 20
12 //! [2] //! [3]
13         property real t//自定义属性
14         SequentialAnimation on t {//执行顺序动画
15             NumberAnimation { to: 1; duration: 2000; easing.type: Easing.InOutQuad }
16             NumberAnimation { to: 0; duration: 2000; easing.type: Easing.InOutQuad }
17             loops: Animation.Infinite//无限循环
18         }
19
20         p2: Qt.point(t, 1 - t)//只有通过Q_PROPERTY宏声明过的属性才可以这样访问
21         p3: Qt.point(1 - t, t)
22     }
23 //! [3] //! [4]
24     Text {
25         anchors.bottom: line.bottom
26
27         x: 20
28         width: parent.width - 40
29         wrapMode: Text.WordWrap
30
31         text: "This curve is a custom scene graph item, implemented using GL_LINE_STRIP"
32     }
33 }

总结:理解qmlRegisterType、Q_PROPERTY的功能非常重要, 他们是你学习qml很重要的一个环节。个人觉着C++和qml混编是一个趋势,虽然QWidget目前开发比较流行,但视图模型分离会让开发效率更高效。

注:该文章是个人学习之用,仅供参考。错误之处还请大家谅解

qml demo分析(customgeometry-贝塞尔曲线)相关推荐

  1. qml demo分析(threadedanimation-线程动画)

    一.效果预览 使用过qml的同学都知道,使用qml做动画效果是非常简单的,再也不需要像QWidget那样,自己模拟一个动画,费时又费力,往往还达不到效果.今天我们就来分析下qml的两种动画实现方式,如 ...

  2. android沿曲线移动,Android动画学习Demo(3) 沿着贝塞尔曲线移动的Property Animation

    Property Animation中最重要,最基础的一个类就是ValueAnimator了.Property Animation利用ValueAnimator来跟踪记录对象属性已经变化了多长时间及当 ...

  3. qml demo分析(threading-线程任务)

    一.关键类说明 qml内置了WorkerScript组件,该组件有一个source属性,可以加载js文件,含有一个名为message的信号,意味着他有一个默认的onMessage槽函数,除此之外他还有 ...

  4. qml demo分析(clocks-时钟)

    一.效果展示 效果如图1所示,时钟列表支持鼠标左右拖动,带有黑色背景的是晚上时钟,无黑色背景的是白天时钟 二.源码分析 1.main.cpp文件中只包含了一个宏,该宏的具体解释请看qml 示例中的关键 ...

  5. java 贝塞尔曲线_贝塞尔曲线:原理、自定义贝塞尔曲线View、使用!!!

    一.原理 转自:http://www.2cto.com/kf/201401/275838.html Android动画学习Demo(3) 沿着贝塞尔曲线移动的Property Animation Pr ...

  6. python 贝塞尔曲线,贝塞尔曲线原理分析及其Android的实现

    本文主要内容为贝塞尔曲线原理解析并用 SurfaceView 实现其展示动画 关于SurfaceView 的使用,大家可以看我的上一篇文章 Android:SurfaceView 的使用(附代码模板) ...

  7. 贝塞尔曲线动画demo(仿美人相机效果)

    效果如图: 仿美人相机,手势滑动隐藏顶部view.为了方便讲解,将屏幕分为几个区域,如图: 在拖动过程中: 1.拖动距离小于minMoveDistance,贝赛尔曲线发生形变 2.拖动大于minMov ...

  8. Android 贝塞尔曲线实战之网易云音乐鲸云特效

    作者:哈哈将 -个推 Android 高级开发工程师 前言 APP开发市场已经告别"野蛮生长"时代,人们不再满足于APP外形创新,而将目光转向全方面的用户体验上.在这过程中,动效化 ...

  9. macOS swift下使用贝塞尔曲线制作五子棋盘(2)

    macOS swift下使用贝塞尔曲线制作五子棋盘(2) 落子 黑白子交替 计算落子的point 功能 判断当前落点是否有相同棋子,并保存 判断输赢 分析 左右分析 上下分析 斜向分析 悔棋 重开游戏 ...

最新文章

  1. R语言条件Logistic回归模型案例:研究饮酒与胃癌的关系
  2. 使用工具类创建一个线程池
  3. 成功解决UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xd3 in position 238: invalid continuation b
  4. Centos7安装tengine-2.3.2版本
  5. 静态生成html的原理
  6. Win10怎么禁用系统更新服务 Win10禁用系统更新服务教程
  7. 计算机视觉技术测试物体距离,应用计算机视觉技术检测物体的形变
  8. singft 函数 matlab,(新)信号与系统MATLAB实验全.doc
  9. 凝血超声手术室行业调研报告 - 市场现状分析与发展前景预测
  10. ubuntu上 grafana + influxdb + telegraf 安装配置
  11. mysql 2049_mysql数据库备份与还原,解决40101和ERROR 2049错误
  12. WSL自定义安装路径
  13. MCU新趋势—Cortex M0/M3/M4 行业应用主题研讨会
  14. 阿里巴巴CTO程立:践行“好科技”,我们正在做这些事
  15. linux 执行sql loader,sql loader使用例子
  16. 微分几何、黎曼几何思想
  17. Intel Atom移动处理器惨败,还被用户和经销商起诉
  18. POJ1250解题报告
  19. OSChina 周一乱弹 —— 花式遛狗法
  20. Engineering Dynamics 3 --- 转动惯量

热门文章

  1. leetcode80. 删除排序数组中的重复项 II
  2. leetcode172. 阶乘后的零 最快算法
  3. 链表的代码实现【数据结构F】
  4. 《Java8实战》笔记(05):使用流
  5. 科目三要注意的失误点
  6. 电子路考容易犯错的五大细节
  7. 车子突然溜坡追尾 驾校教练说挂P挡拉手刹不会溜坡
  8. C语言return关键字
  9. 如此如此,怎能师夷长技以制夷!
  10. jsp页面c标签循环map , c:foreach 循环map