chrome 内核CEF 编译和qt 封装(下)
上篇讲述了如何编译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 封装(下)相关推荐
- win10环境下VTK7.1的编译和Qt调用VTK的详细教程二(VS2013编译支持Qt的VTK库)
本文主要用于编译支持Qt的VTK库,重点在于编译VTK库,供Qt调用. 第1步:新建一个文件夹:vtkDir 第2步:在该文件夹下新建两个文件夹vtk_bin.vtk_src 第3步:将下载好的VTK ...
- 适用于树莓派Raspberry Pi的嵌入式QT平台(二) -- 在Windows下用Qt Creator开发编译Raspberry Qt 5应用程序...
接着上篇 "交叉编译安装Qt Embedded 5.5",我们已经成功在Windows上交叉编译了Raspberry Pi的嵌入式Qt 5.5.那么我们就可以开始开发基于Qt 5的 ...
- rtl8188linux内核配置,编译基于rtl8188cu控制芯片的USB无线网卡在Linux下的配置
本人因为实验的需要,需要在嵌入式linux环境下添加wifi功能,通过在网上调研,选择基于rtl8188cu控制芯片的水星NW150UM无线USB网卡,现简单记录下配置过程. 1.下载最新的rtl81 ...
- 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_ ...
- 【学习笔记】编译Linux内核(下)---KConfig、Makefile详解以及ARM平台Linux内核的编译
本文主要介绍Linxu2.6的内核配置系统. 如果你浏览一下源代码目录,就可以发现源码目录及其子目录中有很多的KConfig文件和Makefile文件.这些文件什么作用呢?正是这些文件组成了Linux ...
- (Qt项视图Demo)封装下链式结构(QListView)的MVC(MVD)用法
对于一些数据量小的列表我们使用QListWidget往往能满足开发的需求,但是对于大数据量的展示来说(几十万,上百万)来说的话,全部加载是一个不是很合适的方法.因此我们使用MVC,这里可能应该叫MVD ...
- 基于FIddler实现Chrome内核下对网页进行填表操作以及原理
由于这段时间比较匆忙,一直没来得及写博客,外加模块功能还不是很齐全~拖了好几个月哈哈. 下面言归正传.使用过易语言软件的童鞋,估计都听说过"填表"是啥玩意,其实就是通过WINDOW ...
- Ubuntu下Android 4.0源码及内核下载编译注意点
Android源码编译再source.android.com上有完整的教程,在这里只说一下自己在下载和编译时遇到的一些问题 一.Android4.0源码下载注意事项: 1.使用64位的ubuntu比较 ...
- 编译arm linux内核,编译Linux内核(下)---KConfig、Makefile详解以及ARM平台Linux内核的编译...
转载自:http://blog.csdn.net/newthinker_wei/article/details/8022696 本文主要介绍Linxu2.6的内核配置系统. 如果你浏览一下源代码目录, ...
- python webkit内核_Winform调用WebKitBrowser,基于chrome内核WebKit的浏览器控件
在C#中,默认的WebBrowser控件默认使用的是IE的core,而IE的种种遭人吐槽的诟病使我不敢轻易使用WebBrowser,因此,打算使用Chrome的内核替换IE.Chrome的内核使用的是 ...
最新文章
- 深圳高一学生,夺冠国际物理奥赛
- ERP与GMP结合在药类企业实施及应用
- 给IDEA给类和方法添加注解
- java map存储对象_JAVA:查找存储在hashMap中的对象的最佳性能方法
- 织梦 mail.class.php,详解织梦模板DEDECMS核心类TypeLink.class.php功能分析
- 《ASP.NET 1.1入门经典—— VISUAL C# .NET 2003编程篇》学习笔记和心得 - 第十章
- 解决:single failed: For artifact {null:null:null:jar}: The groupId cannot be empty. 把工程依赖的jar包打到入jar中
- win10查看端口占用
- (进阶篇)Redis6.2.0 集群 哨兵模式_哨兵工作原理_02
- android之修改CheckBox左侧图标样式
- docker web程序本地化_想要成为前端Star 吗?一首歌时间将React / Vue 应用Docker 化...
- 3G移动通信技术分析
- Unity3d脚本生命周期
- 分享5个viewport相关的jQuery插件
- 中考配额是什么意思_@所有家长!这些中考政策,你应该提前了解↘
- Android studio - UI 界面设计(仿问卷星登陆注册界面)
- Crazy Kids
- ANSI/ISO C++ Professional Programmer's Handbook(7)
- “赋能”企业,数加服装ERP智助企业乘风破浪
- 计算机数字顺序怎么带公式,Excel函数公式:6个数据排序技巧,总有一个适合你!...