一、效果展示

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

图1 贝塞尔曲线

二、源码分析

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

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

  1、main文件

 int main(int argc, char **argv)
{
QGuiApplication app(argc, argv); qmlRegisterType<BezierCurve>("CustomGeometry", , , "BezierCurve");//注册自定义Quick控件到qml系统环境中 QQuickView view;
QSurfaceFormat format = view.format();
format.setSamples();
view.setFormat(format);
view.setSource(QUrl("qrc:///scenegraph/customgeometry/main.qml"));
view.show(); app.exec();
}

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

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

  2、自定义QQuickItem类型

 class BezierCurve : public QQuickItem
{
Q_OBJECT Q_PROPERTY(QPointF p1 READ p1 WRITE setP1 NOTIFY p1Changed)//使用Q_PROPERTY进行声明的宏可以通过属性系统进行操作,例如qss中qproperty-p1:1,1 qml中p1: Qt.point(0, 1)
Q_PROPERTY(QPointF p2 READ p2 WRITE setP2 NOTIFY p2Changed)
Q_PROPERTY(QPointF p3 READ p3 WRITE setP3 NOTIFY p3Changed)
Q_PROPERTY(QPointF p4 READ p4 WRITE setP4 NOTIFY p4Changed) Q_PROPERTY(int segmentCount READ segmentCount WRITE setSegmentCount NOTIFY segmentCountChanged)//WRITE操作之后,发生NOTIFY指定的信号 public:
BezierCurve(QQuickItem *parent = );
~BezierCurve(); //! [2]
QSGNode *updatePaintNode(QSGNode *, UpdatePaintNodeData *);//qml文件中通过SequentialAnimation动画修改p2和p3的值,并触发update函数
//! [2] QPointF p1() const { return m_p1; }
QPointF p2() const { return m_p2; }
QPointF p3() const { return m_p3; }
QPointF p4() const { return m_p4; } int segmentCount() const { return m_segmentCount; } void setP1(const QPointF &p);
void setP2(const QPointF &p);
void setP3(const QPointF &p);
void setP4(const QPointF &p); void setSegmentCount(int count); signals:
void p1Changed(const QPointF &p);
void p2Changed(const QPointF &p);
void p3Changed(const QPointF &p);
void p4Changed(const QPointF &p); void segmentCountChanged(int count); private:
QPointF m_p1;
QPointF m_p2;
QPointF m_p3;
QPointF m_p4; int m_segmentCount;
};

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

 void BezierCurve::setP1(const QPointF &p)
{
if (p == m_p1)
return; m_p1 = p;
emit p1Changed(p);
update();
}

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

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

 import QtQuick 2.0
import CustomGeometry 1.0 //导入自定义包
//! [1] //! [2]
Item {
width:
height: BezierCurve {//直接使用控件名称 导入方式也可以改为import CustomGeometry 1.0 as MyCustom,那么控件使用方式改为MyCustom.BezierCurve
id: line
anchors.fill: parent
anchors.margins:
//! [2] //! [3]
property real t//自定义属性
SequentialAnimation on t {//执行顺序动画
NumberAnimation { to: ; duration: ; easing.type: Easing.InOutQuad }
NumberAnimation { to: ; duration: ; easing.type: Easing.InOutQuad }
loops: Animation.Infinite//无限循环
} p2: Qt.point(t, - t)//只有通过Q_PROPERTY宏声明过的属性才可以这样访问
p3: Qt.point( - t, t)
}
//! [3] //! [4]
Text {
anchors.bottom: line.bottom x:
width: parent.width -
wrapMode: Text.WordWrap text: "This curve is a custom scene graph item, implemented using GL_LINE_STRIP"
}
}

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

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

qml demo分析(customgeometry-贝塞尔曲线)的更多相关文章

  1. qml demo分析(maskedmousearea-异形窗口)

    一.效果展示 如本文的标题所示,这篇文章分析的demo是一个异形窗口,主要展示鼠标在和异形区域交互的使用,效果如图1所示,当鼠标移动到白云或者月亮上时,相应的物体会高亮,当鼠标按下时,物体会有一个放大 ...

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

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

  3. qml demo分析(maroon-小游戏)

    1.效果展示 这篇文章我还是分析一个qt源码中的qml程序,程序运行效果如下图所示. 图1  游戏开始 图2  游戏中 2.源码分析 这个游戏的源码文件比较多,为了能更清楚的了解整个代码,我先整体分析 ...

  4. qml demo分析(abstractitemmodel-数据分离)

    一.概述 qt5之后qml也可以被用于桌面程序开发,今天我就拿出qt demo中的一个qml示例程序进行分析.这个demo主要是展示了qml数据和展示分离的使用方式,qml只专注于快速高效的绘制界面, ...

  5. qml demo分析(externaldraganddrop-拖拽)

    一.效果展示 客户端程序拖拽是一个很常见的需求,对于QWidget程序来说,需要重写如图1这么几个方法,通过重写这几个方法的逻辑,我们就可以控制鼠标拖拽的逻辑,糟糕的是QDrag执行exec后是一个阻 ...

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

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

  7. qml demo分析(text-字体展示)

    上一篇文章分析了一个小游戏,使用qml编写界面+js进行复杂逻辑控制,算是一个比较完整的qml示例代码了,今天就不那么继续变态啦,来看一个简单的字体示例程序吧,该示例代码比较简单,主要是展示了几个简单 ...

  8. qml demo分析(samegame-拼图游戏)

    一.效果展示 相信大家都玩儿过连连看游戏,而且此款游戏也是闲时一款打发时间的趣事,那么接下来我将分析一款类似的游戏,完全使用qml编写界面,复杂逻辑使用js完成.由于此游戏包含4种游戏模式,因此本篇文 ...

  9. qml demo分析(rssnews-常见新闻布局)

    一.效果展示 今儿来分析一篇常见的ui布局,完全使用qml编写,ui交互效果友好,如图1所示,是一个常见的客户端新闻展示效果,左侧是一个列表,右侧是新闻详情. 图1 新闻效果图 二.源码分析 首先先来 ...

随机推荐

  1. Connection reset by peer的常见原因

    1,如果一端的Socket被关闭(或主动关闭,或因为异常退出而 引起的关闭),另一端仍发送数据,发送的第一个数据包引发该异常(Connect reset by peer). Socket默认连接60秒 ...

  2. Guns(开源后台管理系统框架)实战(一)——开发环境搭建

    1. 开发环境搭建 1.1. 开发环境要求 1.2. 配置Maven 1.3. 配置MySQL 1.4. Git克隆项目 1.5. Eclipse导入系统 2. 小结 3. 参考引用 1. 开发环境搭 ...

  3. poj~1904

    Description Once upon a time there lived a king and he had N sons. And there were N beautiful girls ...

  4. FTP用户无法登陆排错详解

    FTP作为一种简单便捷的文件共享技术,在许多企业内部得到使用.若启用FTP的验证控制,管理员更可对不同的用户设置不同的访问权限,控制用户对特定内容的访问.IIS中的FTP站点只有一种验证方式,即基本验 ...

  5. 深入理解springAOP切面的特性

    一张图说明情况

  6. 【bzoj 2303】【Apio2011】方格染色

    题目: http://www.lydsy.com/JudgeOnline/problem.php?id=2303 题解: 很神奇的思路,膜一发大佬http://www.cnblogs.com/HHsh ...

  7. SA SD SE 区别

    [SA(System Analysis)系统分析师] 通过一系列分析手法把User想要的结果,以各种文件方式表达出来. 此过程着重于工作流程和处理逻辑. 规划系统功能和模块. 定出初步的数据库内容及系 ...

  8. C# 在异步线程操作类的变量

    如下代码: public partial class Form1 : Form { public Form1() { InitializeComponent(); } public string Me ...

  9. Bootstrap优秀模板-ColorAdmin.4.3.0

    老牌的Bootstrap商业模板,提供HTML.AngularJS.AngularJS5.Vue.React多种环境,风格覆盖Flat.Material.Apple.Transparent甚至Face ...

  10. PostCSS 基本用法

    1.postcss相关网站 https://www.postcss.com.cn/ https://www.ibm.com/developerworks/cn/web/1604-postcss-css ...