qml demo分析(customgeometry-贝塞尔曲线)
一、效果展示
本篇文章还是带来一个简单的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-贝塞尔曲线)的更多相关文章
- qml demo分析(maskedmousearea-异形窗口)
一.效果展示 如本文的标题所示,这篇文章分析的demo是一个异形窗口,主要展示鼠标在和异形区域交互的使用,效果如图1所示,当鼠标移动到白云或者月亮上时,相应的物体会高亮,当鼠标按下时,物体会有一个放大 ...
- qml demo分析(threadedanimation-线程动画)
一.效果预览 使用过qml的同学都知道,使用qml做动画效果是非常简单的,再也不需要像QWidget那样,自己模拟一个动画,费时又费力,往往还达不到效果.今天我们就来分析下qml的两种动画实现方式,如 ...
- qml demo分析(maroon-小游戏)
1.效果展示 这篇文章我还是分析一个qt源码中的qml程序,程序运行效果如下图所示. 图1 游戏开始 图2 游戏中 2.源码分析 这个游戏的源码文件比较多,为了能更清楚的了解整个代码,我先整体分析 ...
- qml demo分析(abstractitemmodel-数据分离)
一.概述 qt5之后qml也可以被用于桌面程序开发,今天我就拿出qt demo中的一个qml示例程序进行分析.这个demo主要是展示了qml数据和展示分离的使用方式,qml只专注于快速高效的绘制界面, ...
- qml demo分析(externaldraganddrop-拖拽)
一.效果展示 客户端程序拖拽是一个很常见的需求,对于QWidget程序来说,需要重写如图1这么几个方法,通过重写这几个方法的逻辑,我们就可以控制鼠标拖拽的逻辑,糟糕的是QDrag执行exec后是一个阻 ...
- qml demo分析(threading-线程任务)
一.关键类说明 qml内置了WorkerScript组件,该组件有一个source属性,可以加载js文件,含有一个名为message的信号,意味着他有一个默认的onMessage槽函数,除此之外他还有 ...
- qml demo分析(text-字体展示)
上一篇文章分析了一个小游戏,使用qml编写界面+js进行复杂逻辑控制,算是一个比较完整的qml示例代码了,今天就不那么继续变态啦,来看一个简单的字体示例程序吧,该示例代码比较简单,主要是展示了几个简单 ...
- qml demo分析(samegame-拼图游戏)
一.效果展示 相信大家都玩儿过连连看游戏,而且此款游戏也是闲时一款打发时间的趣事,那么接下来我将分析一款类似的游戏,完全使用qml编写界面,复杂逻辑使用js完成.由于此游戏包含4种游戏模式,因此本篇文 ...
- qml demo分析(rssnews-常见新闻布局)
一.效果展示 今儿来分析一篇常见的ui布局,完全使用qml编写,ui交互效果友好,如图1所示,是一个常见的客户端新闻展示效果,左侧是一个列表,右侧是新闻详情. 图1 新闻效果图 二.源码分析 首先先来 ...
随机推荐
- j2ee 使用db.properties连接mysql数据库
转自: http://blog.csdn.net/u013815546/article/details/50808493 注: 下面的方法是未安装构架的写法,需要自己加载驱动并建立连接. 若引入了Ac ...
- Java 读书笔记 (十二) Java Character 类
在实际开发过程中, 我们经常会遇到需要使用对象,而不是内置数据类型的情况. 为了解决这个问题, Java语言为内置数据类型char提供了包装类Character类. 可以使用Character的构造方 ...
- BZOJ_4518_[Sdoi2016]征途_斜率优化
BZOJ_4518_[Sdoi2016]征途_斜率优化 Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到 ...
- BZOJ_3170_[Tjoi2013]松鼠聚会_切比雪夫距离+前缀和
BZOJ_3170_[Tjoi2013]松鼠聚会_切比雪夫距离+前缀和 题意:有N个小松鼠,它们的家用一个点x,y表示,两个点的距离定义为:点(x,y)和它周围的8个点即上下左右四个点和对角的四个点, ...
- BZOJ_3261_最大异或和_可持久化trie
BZOJ_3261_最大异或和_可持久化trie Description 给定一个非负整数序列{a},初始长度为N. 有M个操作,有以下两种操作类型: 1.Ax:添加操作,表示在序列末尾添加一个数x, ...
- [NOIP2016]愤怒的小鸟 D2 T3
Description Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可以用它向第一象限发射一只红色的小鸟,小鸟们的 ...
- nodejs-5.2 axios请求
1.npm官方文档:https://www.npmjs.com/package/axios 2.axios:用于 浏览器 和 node.js的基于Promise的HTTP客户端 请求 特征 从浏览器制 ...
- Go 实现 自动检索 API 错误码代码行 并 打印成文档,例 markDown 形式等
作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguan ...
- JDK10安装配置详解
JDK10安装配置详解 1. 下载jdk10 1.1 官网下载jdk7的软件包: 地址:http://www.oracle.com/technetwork/java/javase/dow ...
- Mtcnn进行人脸剪裁和对齐
from scipy import misc import tensorflow as tf import detect_face import cv2 import matplotlib.pyplo ...