zoukankan      html  css  js  c++  java
  • 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熟知<script src=”url/to/js” />。QML切换js代码更方便,HTML还要求在<script></script>内进行js代码。QML可以直接通过id被js访问。HTML标签必须通过document[id]查找出对象才能访问。

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

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

  • 相关阅读:
    BZOJ1143: [CTSC2008]祭祀river
    接口自动化测试平台-接入持续集成jenkins
    mac OS npm 安装/卸载失败 权限问题解决方案
    初入React源码(一)
    初入React源码(一)
    mac OS git关联github
    重识TCP/IP协议族与HTTP基础
    重识TCP/IP协议族与HTTP基础
    Visual Studio Code mac OS 安装 中文简体语言包
    C#加密类
  • 原文地址:https://www.cnblogs.com/bbqzsl/p/12966641.html
Copyright © 2011-2022 走看看