深入解析QML引擎, 第4部分: 自定义解析器
原文 QML Engine Internals, Part 4: Custom Parsers
———————————————————————————————————————————
上一篇 绑定类型
简要回顾
Q_PROPERTYs无处不在?
让我们稍微扩展一下这个例子,当鼠标点击时,将矩形变红:
自定义解析器
仔细阅读QQuickPropertyChanges类的头文件,我们找到了一点破解颜色属性秘密的线索:在文件末尾还有另一个类:QQuickPropertyChangesParser,它继承于QQmlCustomParser。
想要了解自定义解析器到底是如何工作的,我们得先回顾一下QML文件的加载,在第一篇博文中就已经讲解了,QML文件的加载分为两个阶段:
1.编译阶段
QML文件会被解析和编译一次,最后会创建一个包含指令列表的QQmlCompiledData对象。除指令列表外,它还包含了一些补充这些指令的二进制数据。阅读之前的博文可以看到这些指令是什么样子的。
2.生成阶段
当QML文件被实例化后,QML引擎就会在QQmlCompiledData对象中查找指令,并在虚拟机中执行它们。
自定义解析器在编译和生成阶段都会被调用:
1.在编译阶段,QQmlCustomParser::compile()将被调用
下面的一点调试代码证实了颜色属性是被传递到了自定义解析器中:
输出:
就PropertyChanges的自定义解析器而言,它只是简单地将参数按原样序列化存入QByteArray。
2.在生成阶段,QQuickPropertyChangesParser::setCustomData()将被调用
在我们这个例子中,PropertyChanges的自定义解析器只是简单地把数据传递给QQuickPropertyChanges对象。稍后,由QQuickPropertyChangesPrivate::decode()对这些数据做一些处理:对数据进行反序列化。然后创建一个ExpressionChange对象列表。当属性改变时,这些ExpressionChange就会被执行。
因为QQmlCustomParser是私有的API,所以编写自己的自定义解析器并不是那么简单。
总结
为了支持QML元素中的任意属性,除了使用正常的Q_PROPERTYs,还需要使用自定义解析器。这些自定义解析器获得所有未知属性的列表后,可以对这些属性做任何处理。QML文件的加载过程中,存在编译和生成两个阶段。在编译阶段,自定义解析器创建一个存储二进制数据QByteArray,它存储所有在生成阶段需要的信息。在生成阶段,这个QByteArray被传递给了自定义解析器,这时自定义解析器才真正意义上地使用这些数据。
讨论
PropertyChanges元素具有自定义分析器是相当方便的,仅列出color: "red"就相当不错了。更妙的是,你可以很轻松地列出多个属性:
与之形成对比的是,使用稍微丑陋一点语法的PropertyAction:
这里存在一个不一致的地方:在一种情况下,能够使用优美的语法,在其他情况下,则不能。在我看来是相当混乱的,特别是在你不了解自定义解析器的情况下。
另一个例子是ListElement元素,它同样具有一个自定义解析器。因为它的属性是由自定义解析器解析的,它们表现得不太像正常属性。就我个人而言,我偶然发现了它们的奇怪行为,比如QTBUG-16289。
最后一个使用自定义解析器的例子是Connections元素,当连接到一个从C++里导出的对象的信号时,这是非常有用的:
你是怎么看待自定义解析器存在的意义的?
至此,4篇文章全部翻译结束了,如果有什么疑问或者对QML应用和研究感兴趣的朋友,欢迎加入我们进行讨论(QQ群:280689979)。如需转载,无须我们授权,但需要注明原文链接(该文的链接),及原作者,谢谢!
上一篇 绑定类型
作者:猿基地
链接:https://www.jianshu.com/p/070f1d94071b
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
转载于:https://www.cnblogs.com/wzxNote/p/10569554.html
深入解析QML引擎, 第4部分: 自定义解析器相关推荐
- QQmlEngine(QML引擎)
一.描述 QQmlEngine 类为实例化 QML 组件提供了环境. 每个 QML 组件都在 QQmlContext 中实例化.在 QML 中,上下文是按层次排列的,这个层次由 QQmlEngine ...
- (转)浅谈dedecms模板引擎工作原理及自定义标签
理解织梦模板引擎有什么意义?一方面可以更好地自定义标签.更多在于了解织梦系统,理解模板引擎是理解织梦工作原理的第一步.理解织梦会使我们写php代码时更顺手,同时能学习一些php代码的组织方式. 这似乎 ...
- 驰骋工作流引擎Silverlight版本的流程解析执行器-预计在6月份发布
关键字: Silverlight 驰骋工作流引擎 流程解析执行器 关于silverlight 版本的流程解析执行器的问题 编写人: ccflow 发布日期: 2013/5/20 1, 为什么要开发Si ...
- JAVA关系表达式解析微引擎
为什么80%的码农都做不了架构师?>>> 背景介绍: 为什么需要这个表达式解析微引擎? 首先这个引擎是产生于调用链路跟踪系统,我们知道在调用跟踪系统里经常会根据关键字搜索日志但 ...
- Swift之Codable自定义解析将任意数据类型解析为想要的类型
一.前言 大多数现代应用程序的共同点是,它们需要对各种形式的数据进行编码或解码.无论是通过网络下载的 Json 数据,还是存储在本地的模型的某种形式的序列化表示形式,对于几乎无任何 Swift 代码库 ...
- 类加载机制、双亲委派机制深度解析以及如何自定义类加载器
文章目录 1.类加载运行的全过程 2. JVM类加载器的初始化 3.双亲委派机制 4.编写自定义类加载器 5.(Tomcat)如何打破双亲委派机制 当我们运行一个类的时候,首先要通过类加载机制把类加载 ...
- 2022-10-24 ClickHouse 源码解析-查询引擎经典理论
ClickHouse 源码解析: 综述 ClickHouse 源码解析: MergeTree Write-Path ClickHouse 源码解析: MergeTree Read-Path Click ...
- php全套之七,【独家首发】最新七星修改二开正米酷影视7.2完整版/支持自定义解析/支持PHP7.0及以上...
[独家首发]最新七星修改二开正米酷影视7.2完整版/支持自定义解析/支持PHP7.0及以上 视频播放页右侧栏图片和文字在后台→系统设置→APP设置修改广告位在后台设置~第一步:上传文件/uplod.z ...
- 主题 支持 php 7.2,最新七星修改二开正米酷影视7.2完整版/支持自定义解析/支持PHP7.0及以上...
[独家首发]最新七星修改二开正米酷影视7.2完整版/支持自定义解析/支持PHP7.0及以上 视频播放页右侧栏图片和文字在后台→系统设置→APP设置修改 广告位在后台设置~ 第一步:上传文件/uplod ...
最新文章
- 正则表达式——全部符号解释(详解)
- 几个书本上不常见到的C语言函数
- 代码自动化打包系统【原创】
- (转载)Qt中MOC的一些限制
- [转]Java学习路线图(完整详细2019版)
- golang 反射_Golang 会淘汰 Python 吗?
- debian8安装Odoo中的Barcode Scanner Hardware Driver模块时,提示没有evdev
- 腾讯广告算法大赛 | 初赛第一名心得分享
- int main(int argc,char* argv[])的作用
- POJ NOI MATH-7654 等差数列末项计算
- 黄聪:C#中用ILMerge将所有引用的DLL和exe文件打成一个exe文件,有图解
- TMS320C64x+ DSP-----Cache 优化
- 牛客网 多校3 I三角形(皮克定理)
- 3.0.0 alpha 重磅发布!九大新功能、全新 UI 解锁调度系统新能力
- c++:苹果和虫子(疑问)
- 视频教程-深度学习与TensorFlow 2入门实战-深度学习
- vue数组中添加新字段,改变字段后值没有比变化
- Java实现洛谷 P1428 小鱼比可爱
- 安装office2007安装程序找不到office.zh-cn\*三种详细解决方法
- Python 实现获取【昨天】日期