CEF 与 QML 对比

 

QML,Qt的QML标签语言。CEF,Chromium Embedded Framework我们熟知的chrome浏览器社区开源版。

两者都是名门后代,Qt出生于Nokia,CEF出生于Google Chromium,两者都声名显赫,却大缆都扯不上关系的东西有什么好对比。但当使用过两者进行开发后,发现大家所使用到的东西隐约间有惊人的相似。

本文就以这样的出发点,跟大家走访这两家开发有什么相似,从而增进对彼此的了解。


你是否开发过基于QML的项目,或是基于CEF的项目,你可想过它们之间就像物能之间有一个e=mc^2的伟大公式。扯远又淡了,我列出一个关于QML与CEF的开发公式:

Qt平台+QML(+QtQuick)+JS = CEF平台+HTML5(+JQueryUI)+JS

运行平台(容器):

QT

CEF

 

容器widgets:

QtWidgets

cef-views

 

语言:

QML

HTML5

 

编程(UI)库:

QtQuick

JQuery(UI)

 

JS引擎:

QQmlEngine

V8Engine

OpenGL渲染

支持

支持

 

1. 运行平台,或者说运行的容器。qml文档依赖qt应用程序运行,html文档依赖cef浏览器运行一个道理。为什么是cef,cef开源,qt有社区开源分支,两者都跨平台。

平台层都使用c++,同样支持java,c#,python,这里就除去不讨论。

两者都可以通过js引擎上下文,跟js,*ml语言标签交互。

QT:QQmlContext跟 js , QML

CEF: CefV8Context跟 js, HTML5

2. 容器widgets

运行平台同样可以进行*ML外的native界面开发。Qt可以使用传统的QtWidgets对平台容器窗口开发界面,CEF也可以使用各种views开发界面。可以这样看,CefBrowser是一个特殊的view,专门运行html。而qml界面也必须加载到一个传统的QWidget上运行。

2.1 后台运行*ml

QML不一定要有界面元素,没有界面的QML可以不加载到QWidget上同样可以执行。CEF可以使用off-screen的CefBrowser执行HTML,如同在后台进行一样。

2.2 Layered窗口渲染

CEF可以使用off-screen的CefBrowser进行Layered窗口渲染,QWidget 本身就支持背景透明以及半透明。

2.3 同样是DirectUI

QtWidgets与Cef Views两者都只是两个平台提供的DirectUI,并没有绑定到一个窗口系统的某个窗口,只是平台容器窗口上一块显示区域。不同与wxWidgets,只是在名字上避免跟MS的Windows TM有名字纠纷,实际每个widget都有一个系统窗口作为宿主。而Qt跟Cef只要一个系统窗口作为宿主,运行着它们的DirectUI。

3. *ML语言

两种语言的标签都是脚本引擎上下文(QQmlContext,CefV8Context)的一个对象,通过属性进行访问。可以混合js。不同的是,QML可以定义新的类型,HTML不可以定义新的标签,但是可以通过js的function定义新的对象。所有原生对象以及特性,都要脚本引擎原生支持。这个好理解,同宗v8的node.js添加许多原生对象,你也可以扩展v8为你自己的CEF扩展原生对象。

4. 编程(UI)库:

*ML开发界面,功能所使用到的库的集合体。QML必须使用QtQuick模组。HTML5也有强大的JQuery,包含界面JQueryUI。

5. JS引擎

QQmlEngine就是一个带JS血统的混血新生代,是JS血缘与Qt皇室的QML计划的结晶体。*ML两种语言都可以混合JS语言,声明/定义/访问/调用js变量/对象/函数,也可以导入外部js脚本文档,QML只要import “relative/path/to/js” as objname,HTML熟知内进行js代码。QML可以直接通过id被js访问。HTML标签必须通过document[id]查找出对象才能访问。

然后就是C++与JS的交互,C++与QML的交互,C++通过与JS的交互达到与HTML标签交互。你开发的*ML运行平台的容器可以跟*ML里面的对象/函数进行互调通讯,彼此提供服务又彼此消费对方的服务。你不好做的,我替你扛。你强大的,我就交给你。要什么情(消)报(息),我们私底下幽。

本文只将QML跟基于CEF的两种开发做简单感性上的类比,只为那些只做过QML或只做过CEF,或者两者都没做过的童鞋,想了解对面是什么,或是想知道它们都是做什么的。如果你是两样都做过的,希望能有同感。

你可能感兴趣的:(CEF 与 QML 对比)