原文 QML Engine Internals, Part 4: Custom Parsers

———————————————————————————————————————————

上一篇 绑定类型

简要回顾

图1 QML例子

Q_PROPERTYs无处不在?

让我们稍微扩展一下这个例子,当鼠标点击时,将矩形变红:

图2 扩展例子

自定义解析器

仔细阅读QQuickPropertyChanges类的头文件,我们找到了一点破解颜色属性秘密的线索:在文件末尾还有另一个类:QQuickPropertyChangesParser,它继承于QQmlCustomParser。

想要了解自定义解析器到底是如何工作的,我们得先回顾一下QML文件的加载,在第一篇博文中就已经讲解了,QML文件的加载分为两个阶段:

1.编译阶段

QML文件会被解析和编译一次,最后会创建一个包含指令列表的QQmlCompiledData对象。除指令列表外,它还包含了一些补充这些指令的二进制数据。阅读之前的博文可以看到这些指令是什么样子的。

2.生成阶段

当QML文件被实例化后,QML引擎就会在QQmlCompiledData对象中查找指令,并在虚拟机中执行它们。

自定义解析器在编译和生成阶段都会被调用:

1.在编译阶段,QQmlCustomParser::compile()将被调用

下面的一点调试代码证实了颜色属性是被传递到了自定义解析器中:

图3  证实属性的调试代码

输出:

图4 调试代码输出结果

就PropertyChanges的自定义解析器而言,它只是简单地将参数按原样序列化存入QByteArray。

2.在生成阶段,QQuickPropertyChangesParser::setCustomData()将被调用

在我们这个例子中,PropertyChanges的自定义解析器只是简单地把数据传递给QQuickPropertyChanges对象。稍后,由QQuickPropertyChangesPrivate::decode()对这些数据做一些处理:对数据进行反序列化。然后创建一个ExpressionChange对象列表。当属性改变时,这些ExpressionChange就会被执行。

因为QQmlCustomParser是私有的API,所以编写自己的自定义解析器并不是那么简单。

总结

为了支持QML元素中的任意属性,除了使用正常的Q_PROPERTYs,还需要使用自定义解析器。这些自定义解析器获得所有未知属性的列表后,可以对这些属性做任何处理。QML文件的加载过程中,存在编译和生成两个阶段。在编译阶段,自定义解析器创建一个存储二进制数据QByteArray,它存储所有在生成阶段需要的信息。在生成阶段,这个QByteArray被传递给了自定义解析器,这时自定义解析器才真正意义上地使用这些数据。

讨论

PropertyChanges元素具有自定义分析器是相当方便的,仅列出color: "red"就相当不错了。更妙的是,你可以很轻松地列出多个属性:

图5 多属性例子

与之形成对比的是,使用稍微丑陋一点语法的PropertyAction:

图6 PropertyAction

这里存在一个不一致的地方:在一种情况下,能够使用优美的语法,在其他情况下,则不能。在我看来是相当混乱的,特别是在你不了解自定义解析器的情况下。

另一个例子是ListElement元素,它同样具有一个自定义解析器。因为它的属性是由自定义解析器解析的,它们表现得不太像正常属性。就我个人而言,我偶然发现了它们的奇怪行为,比如QTBUG-16289。

最后一个使用自定义解析器的例子是Connections元素,当连接到一个从C++里导出的对象的信号时,这是非常有用的:

图7 Connections

你是怎么看待自定义解析器存在的意义的?

至此,4篇文章全部翻译结束了,如果有什么疑问或者对QML应用和研究感兴趣的朋友,欢迎加入我们进行讨论(QQ群:280689979)。如需转载,无须我们授权,但需要注明原文链接(该文的链接),及原作者,谢谢!

上一篇 绑定类型

作者:猿基地
链接:https://www.jianshu.com/p/070f1d94071b
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

转载于:https://www.cnblogs.com/wzxNote/p/10569554.html

深入解析QML引擎, 第4部分: 自定义解析器相关推荐

  1. QQmlEngine(QML引擎)

    一.描述 QQmlEngine 类为实例化 QML 组件提供了环境. 每个 QML 组件都在 QQmlContext 中实例化.在 QML 中,上下文是按层次排列的,这个层次由 QQmlEngine ...

  2. (转)浅谈dedecms模板引擎工作原理及自定义标签

    理解织梦模板引擎有什么意义?一方面可以更好地自定义标签.更多在于了解织梦系统,理解模板引擎是理解织梦工作原理的第一步.理解织梦会使我们写php代码时更顺手,同时能学习一些php代码的组织方式. 这似乎 ...

  3. 驰骋工作流引擎Silverlight版本的流程解析执行器-预计在6月份发布

    关键字: Silverlight 驰骋工作流引擎 流程解析执行器 关于silverlight 版本的流程解析执行器的问题 编写人: ccflow 发布日期: 2013/5/20 1, 为什么要开发Si ...

  4. JAVA关系表达式解析微引擎

    为什么80%的码农都做不了架构师?>>>    背景介绍: 为什么需要这个表达式解析微引擎? 首先这个引擎是产生于调用链路跟踪系统,我们知道在调用跟踪系统里经常会根据关键字搜索日志但 ...

  5. Swift之Codable自定义解析将任意数据类型解析为想要的类型

    一.前言 大多数现代应用程序的共同点是,它们需要对各种形式的数据进行编码或解码.无论是通过网络下载的 Json 数据,还是存储在本地的模型的某种形式的序列化表示形式,对于几乎无任何 Swift 代码库 ...

  6. 类加载机制、双亲委派机制深度解析以及如何自定义类加载器

    文章目录 1.类加载运行的全过程 2. JVM类加载器的初始化 3.双亲委派机制 4.编写自定义类加载器 5.(Tomcat)如何打破双亲委派机制 当我们运行一个类的时候,首先要通过类加载机制把类加载 ...

  7. 2022-10-24 ClickHouse 源码解析-查询引擎经典理论

    ClickHouse 源码解析: 综述 ClickHouse 源码解析: MergeTree Write-Path ClickHouse 源码解析: MergeTree Read-Path Click ...

  8. php全套之七,【独家首发】最新七星修改二开正米酷影视7.2完整版/支持自定义解析/支持PHP7.0及以上...

    [独家首发]最新七星修改二开正米酷影视7.2完整版/支持自定义解析/支持PHP7.0及以上 视频播放页右侧栏图片和文字在后台→系统设置→APP设置修改广告位在后台设置~第一步:上传文件/uplod.z ...

  9. 主题 支持 php 7.2,最新七星修改二开正米酷影视7.2完整版/支持自定义解析/支持PHP7.0及以上...

    [独家首发]最新七星修改二开正米酷影视7.2完整版/支持自定义解析/支持PHP7.0及以上 视频播放页右侧栏图片和文字在后台→系统设置→APP设置修改 广告位在后台设置~ 第一步:上传文件/uplod ...

最新文章

  1. 正则表达式——全部符号解释(详解)
  2. 几个书本上不常见到的C语言函数
  3. 代码自动化打包系统【原创】
  4. (转载)Qt中MOC的一些限制
  5. [转]Java学习路线图(完整详细2019版)
  6. golang 反射_Golang 会淘汰 Python 吗?
  7. debian8安装Odoo中的Barcode Scanner Hardware Driver模块时,提示没有evdev
  8. 腾讯广告算法大赛 | 初赛第一名心得分享
  9. int main(int argc,char* argv[])的作用
  10. POJ NOI MATH-7654 等差数列末项计算
  11. 黄聪:C#中用ILMerge将所有引用的DLL和exe文件打成一个exe文件,有图解
  12. TMS320C64x+ DSP-----Cache 优化
  13. 牛客网 多校3 I三角形(皮克定理)
  14. 3.0.0 alpha 重磅发布!九大新功能、全新 UI 解锁调度系统新能力
  15. c++:苹果和虫子(疑问)
  16. 视频教程-深度学习与TensorFlow 2入门实战-深度学习
  17. vue数组中添加新字段,改变字段后值没有比变化
  18. Java实现洛谷 P1428 小鱼比可爱
  19. 安装office2007安装程序找不到office.zh-cn\*三种详细解决方法
  20. Python 实现获取【昨天】日期

热门文章

  1. 207. Course Schedule 课程表
  2. Go语言集合(Map)
  3. Python递归实现汉诺塔
  4. LINUX 基础命令和预处理
  5. 【机器视觉】 measure_pos算子
  6. 【Linux系统编程】线程栈大小
  7. 【Linux网络编程】多播、组播
  8. pandas 作图 统计_解决pandas 作图无法显示中文的问题
  9. 307 跳转会携带请求方法吗_面试官:GET和POST两种基本请求方法有什么区别
  10. 诺基亚n73支持java_JAVA性能 vs 诺基亚N71、E61_诺基亚 N73_手机其它OS-中关村在线