qml demo分析(customgeometry-贝塞尔曲线)

一、效果展示

  本篇文章还是带来一个简单的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目前开发比较流行,但视图模型分离会让开发效率更高效。

 

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/457167.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php 打包上传的文件,PHP单文件上传原理及上传函数的打包

PHP单文件上传原理及上传函数的封装服务器(临时文件)——>指定目录,当文件进入服务器时它就是临时文件了,这时操作中要用临时文件的名称tmp_name。//在客户端设置上传文件的限制(文件类型和大小)是不安全的&#xff0c;因为客户能通过源代码修改限制&#xff0c;所以在服务端…

celery AttributeError: 'str' object has no attribute 'items'

AttributeError: str object has no attribute items python manage.py celery worker --loglevelinfo 查了好久发现原来是因为以前下的redis版本过高&#xff08; 3.0.1 &#xff09;&#xff0c;重装redis pip install redis2.10.6

equals和==的区别(转)

基本数据类型&#xff0c;也称原始数据类型。byte,short,char,int,long,float,double,boolean&#xff0c;他们之间的比较&#xff0c;应用双等号&#xff08;&#xff09;,比较的是他们的值。 复合数据类型(类) 当他们用&#xff08;&#xff09;进行比较的时候&#xff0c;…

Python 中的range,以及numpy包中的arange函数

range函数函数说明&#xff1a; range(start, stop[, step]) -> range object&#xff0c;根据start与stop指定的范围以及step设定的步长&#xff0c;生成一个序列。  参数含义&#xff1a;start:计数从start开始。默认是从0开始。例如range&#xff08;5&#xff09;等价…

php角色权限安全,php – 安全的chmod权限?

新创建的文件和目录的默认权限由umask环境变量设置.文件的所有者和root可以更改权限.如果您不需要在应用程序中使用chmod,请将其保留在禁用列表中.你应该看看安全性的方式是&#xff1a;现在比我更聪明的人让chmod成为我应用程序中更安全的部分之一.因此,我将花费我的时间使其他…

namespace! 报错

在工程文件中url 定义namespace需要 from django.contrib import admin from django.urls import path,include from django.conf.urls import url urlpatterns [path(admin/, admin.site.urls),url(r^liu/,include(myApp.urls,namespaceapp)), ] 在myApp 的urls中 加这句 a…

test.php.bak,MongoDB热备份工具:解决官方版备份缺陷

贺春旸&#xff0c;凡普金科DBA团队负责人&#xff0c;《MySQL管理之道&#xff1a;性能调优、高可用与监控》第一、二版作者&#xff0c;曾任职于中国移动飞信、安卓机锋网。致力于MariaDB、MongoDB等开源技术的研究&#xff0c;主要负责数据库性能调优、监控和架构设计。工具…

zookeeper工作原理、安装配置、工具命令简介

1 Zookeeper简介Zookeeper 是分布式服务框架&#xff0c;主要是用来解决分布式应用中经常遇到的一些数据管理问题&#xff0c;如&#xff1a;统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等等。 ZooKeeper是一个分布式的&#xff0c;开放源码的分布式应用程序…

流式大数据处理的三种框架:Storm,Spark和Samza

许多分布式计算系统都可以实时或接近实时地处理大数据流。本文将对三种Apache框架分别进行简单介绍&#xff0c;然后尝试快速、高度概述其异同。 Apache Storm 在Storm中&#xff0c;先要设计一个用于实时计算的图状结构&#xff0c;我们称之为拓扑&#xff08;topology&#x…

models.ForeignKey( ,on_delete=models.CASCADE)    # 关联外键

# 关联外键 sgrade models.ForeignKey("Grades",on_deletemodels.CASCADE) 版本跟新后忘记加on_deletemodels.CASCADE 报错困扰了很久 多读报错信息 from django.db import models# Create your models here. class Grades(models.Model):gname models.Cha…

java 产生无重复的随机数,Java创建无重复的随机数

小编典典最简单的方法是创建一个可能数字的列表(1..20或任何数字)&#xff0c;然后用对其进行混洗Collections.shuffle。然后&#xff0c;只需考虑你想要的许多元素。如果你的范围最终等于你需要的元素数量(例如&#xff0c;用于洗牌的卡片)&#xff0c;则这非常好。如果你想要…

linux_bash_shell_cheat_sheet(自译)

【说明】 发现错误或不足请务必联系我&#xff01;&#xff01;&#xff01; linux_bash_shell_cheat_sheet.pdf &#xff08;英文原本以及译本下载&#xff0c;链接失效请私信或邮箱联系&#xff09; 转载于:https://www.cnblogs.com/15ho/p/5947534.html

Day04-循环和列表

循环和列表 一、循环(***) 1.1 概念 广义&#xff1a;一个周期现象或者重复出现的情况&#xff0c;这种状态被称为循环 狭义&#xff1a;在满足条件的情况下&#xff0c;反复执行某一段代码&#xff0c;在编程语言中出现的这种现象被称为循环。被反复执行的这段代码被称为循环…

热血街头Java,下载_我爱法语 V3.01 多国语言版_6z6z下载站

我爱法语是一款功能强大的法语电子词典工具。融合了法汉&#xff0c;汉法&#xff0c;法法&#xff0c;英法&#xff0c;法英&#xff0c;英汉&#xff0c;法意等各类词库。该工具使用灵活&#xff0c;操作简单&#xff0c;充分吸收了法汉、汉法、法法、英法、法英、英汉、法意…

【demo练习二】:WPF依赖属性的练习

2016-10-11 依赖属性demo小样&#xff1a; 要求&#xff1a;在窗口中点击按钮&#xff0c;利用设置“依赖属性”把Label和TextBox控件里的属性值进行改变。 MainWindow.xaml代码&#xff1a; <Window x:Class"依赖属性1.MainWindow" xmlns"http://schemas.m…

BZOJ 1087 [SCOI2005]互不侵犯King ——状压DP

【题目分析】 沉迷水题&#xff0c;吃枣药丸。 【代码】 #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define F(i,j,k) for (int ij;i<k;i) #define ll long long int cot[512],c1[512]…

Django中object.all

前言 先抛出一个问题。银行就相当于一个数据库&#xff0c;你去银行取钱存钱办卡销卡&#xff0c;是你告诉银行柜员方便还是你自己去操作电脑办卡取卡方便&#xff1f;&#xff08;你还不一定会&#xff0c;假设自动存款机还没发明&#xff09;&#xff0c;object在数据库中就…

java中为什么设计包装类,Java 中为什么要设计包装类

最近文章更新频率慢了&#xff0c;因为最近在准备暑期实习&#xff0c;之前寻思着一边复习一边写文章&#xff0c;两全其美。后来发现一篇读起来比较舒服的文章写出来加上配图得花上四五个小时甚至更多&#xff0c;但这个知识点我可能半个小时就能复习完了&#xff0c;春招在即…

bfc

BFC 已经是一个耳听熟闻的词语了&#xff0c;网上有许多关于 BFC 的文章&#xff0c;介绍了如何触发 BFC 以及 BFC 的一些用处&#xff08;如清浮动&#xff0c;防止 margin 重叠等&#xff09;。虽然我知道如何利用 BFC 解决这些问题&#xff0c;但当别人问我 BFC 是什么&…

Python语法异常 Exception

常见异常&#xff1a;Exception 所有异常的基类AttributeError 特性应用或赋值失败时引发IOError 试图打开不存在的文件时引发IndexError 在使用序列中不存在的索引时引发KeyError …