上篇讲述了如何编译cef 成果物以及验证方法。 但在实际开发过程中需要对cef 关键库进行再次封装,以便在项目开发过程中更加方便的使用此库。本文结合qt 框架进行此库的封装。

一、 CEF结构介绍

1、 CEF主进程和窗口之间的结构关系

一个浏览器有很多个CefBrowser窗口,这些窗口都是在Browser进程中创建。browser进程用来管理和处理回调函数消息。Renderer进程用来实现网页的渲染,每个renderer进程包含有一个主网页mainframe和多个子网页subframe。

2、Renderer进程的实现结构

renderer程序继承CefApp和CefRenderProcessHandler类,在main函数中初始化。通过CefSettings.browser_subprocess_path配置render可执行程序路径。browser进程就会去启动这个进程去渲染网页。

3、browser进程的实现结构

browserapp要继承CefApp和CefBrowserProcessHandler类。实现browserapp的定义。同时要新建clienthandler类实现图中的回调函数接口类,用来处理拦截响应请求、管理生命周期、下载、显示加载、右键菜单等。在mian函数中初始化、启动消息循环。调用CefBrowserHost的静态方法创建browser窗口对象,在render进程的Frame中加载渲染内容。

二、cef  进程开发模式

1、进程

CEF3是多进程架构的,CEF3进程主要有一个Browser(浏览器)进程和多个Renderer(渲染)进程。Browser被定义为主进程,负责窗口管理,网络请求,网页管理 、网络交互。browser从服务器器请求到了响应,将html文本发送给Renderer 进程,render进程加载html,进行渲染,展示网页的内容;除此之外,Renderer进程还负责Js Binding和对Dom节点的访问。Browser和Renderer进程可以通过发送异步消息进行双向通信。主应用程序很大,加载时间比较长,或者不能在非浏览器进程里使用,则宿主程序可使用独立的可执行文件去运行这些Renderer进程。这可以通过配置CefSettings.browser_subprocess_path变量做到。

2、 线程

Browser进程中包含如下主要的线程:

  • TID_UI 线程是浏览器的主线程。如果应用程序在调用调用CefInitialize()时,传递CefSettings.multi_threaded_message_loop=false,这个线程也是应用程序的主线程。
  • TID_IO 线程主要负责处理IPC消息以及网络通信。
  • TID_FILE 线程负责与文件系统交互。

每个CEF3应用程序都是相同的结构

  • 提供入口函数,用于初始化CEF、运行子进程执行逻辑或者CEF消息循环。
  • 提供CefApp实现,用于处理进程相关的回调。
  • 提供CefClient实现,用于处理Browser实例相关的回调。
  • 执行CefBrowserHost::CreateBrowser()创建一个Browser实例,使用CefLifeSpanHandler管理Browser对象生命周期。
  • 需要在程序的入口函数执行cef对象创建,初始化,命令行参数解析,CEF属性设置,和CEF消息循环开启等。CEF需要启动一个主进程来管理网页见面。这个主进程就是在man函数中启动,进入消息循环,直到程序结束,才退出main函数。

3.   CEF单实例进程

demo里的单进程例子

单进程开发模式:

多进程开发模式:

三、 qt 封装

1、构建qt  主进程 dll 工程。为了实现把cef 相关接口信息透传到qt 主进程里。

主进程重写cef 提供的类:

ClientHandler、 public CefApp

子进程重写cef 提供的类

CefApp、CefRenderProcessHandler、CefV8Handler

2、核心原理:通过上层定义cef 提供的相关接口指针,并结合c++ 11 提供的std::function、std::bind 功能实现上层指针和底层指针绑定。通过此技术实现cef 底层接口参数能通过qt 信号槽机制发送到对应的界面,通过功能函数模板 实现对cef  底层相关的接口调用,最终达到预期目的,实现cef 层的qt 封装。

3.最后相关成果物

需要导出的头文件如下:

在工程属性文件里配置头文件和lib 库路径,然后根据程序的初始化流程创建cef 窗口,并把窗口插入到界面布局中,show 即可。

验证结果如下:

核心类的详解参考:https://www.cnblogs.com/bclshuai/p/12722607.html

chrome 内核CEF 编译和qt 封装(下)相关推荐

  1. win10环境下VTK7.1的编译和Qt调用VTK的详细教程二(VS2013编译支持Qt的VTK库)

    本文主要用于编译支持Qt的VTK库,重点在于编译VTK库,供Qt调用. 第1步:新建一个文件夹:vtkDir 第2步:在该文件夹下新建两个文件夹vtk_bin.vtk_src 第3步:将下载好的VTK ...

  2. 适用于树莓派Raspberry Pi的嵌入式QT平台(二) -- 在Windows下用Qt Creator开发编译Raspberry Qt 5应用程序...

    接着上篇 "交叉编译安装Qt Embedded 5.5",我们已经成功在Windows上交叉编译了Raspberry Pi的嵌入式Qt 5.5.那么我们就可以开始开发基于Qt 5的 ...

  3. rtl8188linux内核配置,编译基于rtl8188cu控制芯片的USB无线网卡在Linux下的配置

    本人因为实验的需要,需要在嵌入式linux环境下添加wifi功能,通过在网上调研,选择基于rtl8188cu控制芯片的水星NW150UM无线USB网卡,现简单记录下配置过程. 1.下载最新的rtl81 ...

  4. mingw版本下qt与HTML,QT5.10开发(2) 在Windows 10下使用MinGW编译 静态Qt 5.10 release版 详细过程...

    Qt建议安装动态链接Dbug版和编译安装静态链接release版 前提: 先安装动态链接Dbug版,方法:QT5.10开发(1)安装QT5.10 地址:http://blog.csdn.net/qq_ ...

  5. 【学习笔记】编译Linux内核(下)---KConfig、Makefile详解以及ARM平台Linux内核的编译

    本文主要介绍Linxu2.6的内核配置系统. 如果你浏览一下源代码目录,就可以发现源码目录及其子目录中有很多的KConfig文件和Makefile文件.这些文件什么作用呢?正是这些文件组成了Linux ...

  6. (Qt项视图Demo)封装下链式结构(QListView)的MVC(MVD)用法

    对于一些数据量小的列表我们使用QListWidget往往能满足开发的需求,但是对于大数据量的展示来说(几十万,上百万)来说的话,全部加载是一个不是很合适的方法.因此我们使用MVC,这里可能应该叫MVD ...

  7. 基于FIddler实现Chrome内核下对网页进行填表操作以及原理

    由于这段时间比较匆忙,一直没来得及写博客,外加模块功能还不是很齐全~拖了好几个月哈哈. 下面言归正传.使用过易语言软件的童鞋,估计都听说过"填表"是啥玩意,其实就是通过WINDOW ...

  8. Ubuntu下Android 4.0源码及内核下载编译注意点

    Android源码编译再source.android.com上有完整的教程,在这里只说一下自己在下载和编译时遇到的一些问题 一.Android4.0源码下载注意事项: 1.使用64位的ubuntu比较 ...

  9. 编译arm linux内核,编译Linux内核(下)---KConfig、Makefile详解以及ARM平台Linux内核的编译...

    转载自:http://blog.csdn.net/newthinker_wei/article/details/8022696 本文主要介绍Linxu2.6的内核配置系统. 如果你浏览一下源代码目录, ...

  10. python webkit内核_Winform调用WebKitBrowser,基于chrome内核WebKit的浏览器控件

    在C#中,默认的WebBrowser控件默认使用的是IE的core,而IE的种种遭人吐槽的诟病使我不敢轻易使用WebBrowser,因此,打算使用Chrome的内核替换IE.Chrome的内核使用的是 ...

最新文章

  1. 深圳高一学生,夺冠国际物理奥赛
  2. ERP与GMP结合在药类企业实施及应用
  3. 给IDEA给类和方法添加注解
  4. java map存储对象_JAVA:查找存储在hashMap中的对象的最佳性能方法
  5. 织梦 mail.class.php,详解织梦模板DEDECMS核心类TypeLink.class.php功能分析
  6. 《ASP.NET 1.1入门经典—— VISUAL C# .NET 2003编程篇》学习笔记和心得 - 第十章
  7. 解决:single failed: For artifact {null:null:null:jar}: The groupId cannot be empty. 把工程依赖的jar包打到入jar中
  8. win10查看端口占用
  9. (进阶篇)Redis6.2.0 集群 哨兵模式_哨兵工作原理_02
  10. android之修改CheckBox左侧图标样式
  11. docker web程序本地化_想要成为前端Star 吗?一首歌时间将React / Vue 应用Docker 化...
  12. 3G移动通信技术分析
  13. Unity3d脚本生命周期
  14. 分享5个viewport相关的jQuery插件
  15. 中考配额是什么意思_@所有家长!这些中考政策,你应该提前了解↘
  16. Android studio - UI 界面设计(仿问卷星登陆注册界面)
  17. Crazy Kids
  18. ANSI/ISO C++ Professional Programmer's Handbook(7)
  19. “赋能”企业,数加服装ERP智助企业乘风破浪
  20. 计算机数字顺序怎么带公式,Excel函数公式:6个数据排序技巧,总有一个适合你!...

热门文章

  1. 单片机简易时钟开发(protues)
  2. java web 播放器代码_各种网页播放器代码大全
  3. 软件测试理论基础知识
  4. Linux窗口字是倒着的,linux反撇号怎么打出来
  5. scala入门学习之类的使用
  6. Mac上删除音频设备
  7. 气象报告是什么计算机领域,计算机辅助翻译系统在亚运气象服务方面的应用报告...
  8. cdr怎么转换成psd转换为位图标准_CorelDRAW矢量图怎么转位图?
  9. vs2005中文版/2010中文旗舰版等安装步骤和注意
  10. 巧用代理猎手揪出局域网中的二级代理