关于qml引擎原理,要从google V8 入手,开始使用qml的时候会对它的语法感到不解,虽然是javascript语言,但总是对各种操作感到困惑,尤其是与后台c++的交互,为什么需要做类型注册、对象注册,直到最近做的一些技术调查后,才感觉明朗了。
v8一般都在各类浏览器中使用,例如chrome,google开源一套实现处理javsscript脚本语言的V8库,会针对javascript语法进行解析,提取出脚本中的AST对象树,而qml脚本就是javascript语法,而qml引擎就是基于V4、V8实现的, qml和qt quick中很多的实现也是在这个原理上实现的,所以了解v8后,就会对qml中的一些神操作霍然开朗。
V8编译流水线:
V8 使用编译器和混合器结合JIT(Just In Time)的方式处理Js代码,
详细的相关介绍可以参照极客时间图解GoogleV8的教程,能够更深一步了解JavaScript语言如何解析、运行;
v8几个关键功能:
打通javsscript脚本代码和后台c++代码的,就是绑定在context中ObjectTemplat,它会绑定c++中对象、函数、类到Js中,然后JS代码中就可以运行c++中的代码内容,所以说qml与c++调用的方式就是基于底层v8的,也是通过注册绑定的方式,将c++中的类型、函数、对象通知给前台qml引擎,而c++代码要想调用js中对象或者函数,就是通过findname的方式,根据名称查找,这些在v8的库中都有对应的接口实现,有此基础,qml中的各类操作就好理解啦。
实际上,qml脚本中各类图形组件在c++层都会有对应的实现,qml脚本部分提供了组件的JS实现,最后会调用到c++层进行opengl的绘制,所以再对照Qt的文档,Item对应QtquickItem,这些都在v8引擎中做了类型的映射。
JS脚本调用v8运行代码demo:
https://blog.csdn.net/feiyinzilgd/article/details/8453230
关于Qml V8引擎相关资料:
https://www.cnblogs.com/wzxNote/p/10599370.html
了解这些,再分析qml、qt代码的时候就容易了不少。