qt谷歌浏览器,qt嵌入谷歌浏览器

很多朋友对于qt谷歌浏览器和qt嵌入谷歌浏览器不太懂,今天就由小编来为大家分享,希望可以帮助到大家,下面一起来看看吧!

qt谷歌浏览器,qt嵌入谷歌浏览器

本文目录

  1. Qt嵌入浏览器(六)——QCefView实现JS通信接口
  2. 谷歌浏览器用的是什么内核
  3. Qt嵌入浏览器(五)——CEF入口与QCefView控件的使用

一、Qt嵌入浏览器(六)——QCefView实现JS通信接口

1、上一节中,我们完成了CEF各基本组件的封装,并完成了浏览器基本功能的实现。>>点这里回顾上节内容

2、本节我们将尝试扩展所实现的各组件,实现浏览器与页面的双向通信。

3、上一节曾提到过,CEF应用在默认情况下包含很多子进程,这些进程会共享同一个执行入口。除了主进程的各类处理接口外,CEF还提供了各类子进程的处理接口。而页面到浏览器的消息通道就可以借助对渲染进程的控制来实现,整体流程如下:

4、完成上述步骤后,在页面调用对应的消息通道函数时,V8处理器则会相应地进行处理,从而完成消息的发送。

5、另一方面,实现浏览器到页面的消息通道和第二节中基于Qt WebEngine的方法类似,CEF也提供了执行JS脚本的方法,只需在页面中定义好对应的消息接口,并通过执行脚本方法执行该接口即可完成消息的发送。

6、因此,实现双向通道主要的问题集中在针对渲染进程处理和JS脚本执行的扩展上。接下来先就渲染进程处理进行说明。

7、为了实现对渲染进程的处理,我们首先需要向上一节中封装的QCefContext中添加对渲染进程入口的解析和处理。具体实现如下:

8、上面的实现除了处理了CEF主进程外,还判断了子进程是否为渲染进程(Windows环境下的renderer进程和Linux环境下的zygote进程),如果发现当前处理的是渲染进程,则创建一个渲染进程处理器QCefRenderHandler的实例。QCefRenderHandler的声明如下:

9、和主进程CefApp的实现类似,这里也实现了CefApp接口,此外额外实现了CefRenderProcessHandler接口的OnContextCreated方法,来获取V8上下文的引用,具体实现如下:

10、上面的实现将sendMessage函数定义为消息通道,并注册到了window对象上。sendMessage函数的具体实现则放在v8Handler的实现中。QCefV8Handler声明如下:

11、 QCefV8Handler通过实现CEF V8处理器的Execute执行方法,完成对所加载的JS函数的过滤,并进行相应的处理,实现如下:

12、这里首先对函数名和参数进行了校验,之后调用CefBrowser的IPC方法SendProcessMessage向主进程的CefClient发送消息,从而完成页面向浏览器主进程消息的传递。

13、要实现页面到浏览器的消息通道,除了完成了上面渲染进程的控制扩展,我们还需要在QCefClient中添加接收IPC消息的接口实现。首先在QCefClient头文件中声明对CefClient接口的重载:

14、然后实现这个接口,完成消息的接收处理:

15、可以看到这里只是对收到的消息进行了简单的转换,并通过信号发送给感兴趣的下游控件使用。在第四小节的实现中,我们将QCefClient封装到了QCefView中,因此在QCefView中也需要将这个信号转发给它的下游控件:

16、这样,QCefView接收JS消息的通道就实现完成了。

17、这里额外讲解一下有关js alert的特殊处理。要实现js调用alert方法时的弹窗提醒,需要额外在CefClient中实现CefJSDialogHandler接口的OnJSDialog方法,参考实现如下:

18、承前所述,浏览器到页面的消息发送通过CEF的JS脚本执行接口实现。首先在QCefView中,声明并实现一个执行JS脚本的方法:

19、然后指定一个特定的JS方法,作为消息通道使用:

20、如此,QCefView发送JS的通道也实现完成了。

21、完成了消息通道的实现,接下来我们实际使用一下我们定义好的消息通道。

22、首先是Qt端的实现,在MainDlg的initWebView方法中,添加对JS消息的监听,并将监听到的消息通过QMessageBox显示出来:

23、然后添加文本输入和发送按钮,并在按钮点击信号对应的槽中调用QCefView的消息发送方法:

24、接下来在页面端实现消息接收和发送的接口msgutils.js:

25、可以看到这里我们使用了上面定义的recvMessage和sendMessage两个函数。然后在页面上调用这些接口:

26、实际运行一下浏览器,并加载我们实现的这个页面,消息发送效果如下:

27、有关CEF消息通道的讲解就先进行到这里。下一节将分析使用CEF接口实现Https双向认证的方法。

28、 [1] Chromium Embedded Framework官网

29、 [2] Chromium Embedded Framework官方教程

二、谷歌浏览器用的是什么内核

Google宣布将在未来的 GoogleChrome/Chromium中使用基于WebKit的 fork Web渲染引擎:Blink。同时Opera表示也将跟进 Google Chrome/Chromium的步伐。

Google Chrome/Chromium从创始至今一直使用 WebKit(WebCore)作为HTML/CSS渲染引擎。WebKit早先由 Apple由 KHTML项目 fork出来,用于Safari浏览器的 Web引擎。

由于宽松的协议、轻量级的设计和便捷的应用程序内嵌 API,WebKit逐渐变得流行起来,除了 Google Chrome/Chromium和 Safari,它在移动终端( Symbian S60,Android,iOS)到 Toolkit集成(GTK+, Qt4)都有不错的收获。

2007年6月29日,iPhone上市,WebKit进入iPhone OS平台,而且立即成为iPhone OS平台独一无二的排版引擎。

Google开发的手机操作系统Android中内置的浏览器也是采用的WebKit引擎。

诺基亚公司将WebKit移植到Symbian S60操作系统中,并开发了基于Webkit的手机浏览器“Web browser for S60”,广泛用于诺基亚、三星、LG等基于Symbian S60操作系统的手机中。

Palm推出第一款基于WebKit的操作系统,Palm Pre是第一款基于该系统的手机产品。

尽管WebKit的原型K内核是由Qt写成,但Linux下目前最受瞩目的WebKit项目却是Gnome领导的WebKit/Gtk+。随着奇趣科技于2008年6月被Nokia收购,Qt方面也加快了WebKit的“回归”进程。

参考资料来源:百度百科-blink引擎

三、Qt嵌入浏览器(五)——CEF入口与QCefView控件的使用

1、上一节中我们讲解了基于CEF浏览器开发的基本方法,并实现了QCefView控件和其核心组件QCefClient。>>点这里回顾上节内容

2、先来回顾一下上一节中提到的CEF3应用整体结构:

3、其中第三条浏览器实例相关的实现在上一节中已经完成了,本篇我们将继续完成另一个核心组件QCefApp的开发,并通过实际使用QCefView,展示如何提供CEF初始化入口,最终完成浏览器核心功能和基本UI的开发。

4、和CefClient类似,我们的应用程序需要提供一个CefApp的封装,来处理进程相关的回调——这里进程相关的回调对于我们要实现的简单浏览器而言,就是对浏览器进程本身的管理。因此,我们的QCefApp组件头文件声明如下:

5、和CefClient类似,CefApp也可以通过继承多个接口的方式实现进程级的各类管理。因为我们要实现的简单浏览器暂时不涉及太多复杂的管理,所以这里只简单实现了浏览器进程处理和上下文初始化的接口。同样和CefClient类似,对于CefXXXHandler接口,只需要将引用设为本实例,即可重载对应接口所提供的方法了。

6、额外说明一点:这里的创建浏览器进程方法里有一个添加ca证书的方法,目前先作为预留,有关ca证书和https的话题在之后的小节中会有专门的讲解。

7、浏览器上下文初始化、添加和关闭浏览器接口的具体实现如下:

8、通过上面的实现可以看出,添加浏览器实例进程实际上就是创建了一个QCefClient的引用,并将这个引用和浏览器相关的一些设置传入到静态方法CefBrowserHost::CreateBrowser中。而OnContextInitialized方法通过设置m_contextReady标志确保在创建浏览器实例时CEF上下文已初始化完成。

9、在完成CefApp组件的实现后,我们已经基本凑齐了启动CEF所需的零件。最后让我们来看看如何把这些零件借助CEF程序入口组装起来。

10、首先,声明一个QCefContext类,来封装CEF程序入口所需的基本设置和初始化方法:

11、其中,负责初始化CEF的initCef方法实现如下:

12、这个初始化方法包含了下面流程:

13、这里需要特别说明的是,CEF应用在默认情况下包含很多子进程(渲染进程、插件、GPU进程等等),这些进程会共享同一个执行入口。这里我们简单起见,仅就主进程进行处理——从上面的实现可以看到,当检测到当前进程为主进程时,创建一个CefApp的实例即可。这个实例的引用会通过cefApp()方法提供给需要获取CefApp的其他组件使用。

14、接下来我们来看看如何实际使用上面封装好的程序入口。

15、首先声明一个继承了QDialog的主窗口MainDlg:

16、在这个主窗口的构造方法中,会调用初始化QCefView的方法initWebview:

17、 initWebview方法包含了QCefView界面布局相关的一些设置,这里我们略过这些实现,只专注于QCefView本身初始化的流程:

18、从上面的实现可以看出,这里我们只需要通过CefApp的添加浏览器方法获取QCefClient的引用,并将其提供给QCefView,就能简单完成QCefView控件的创建。

19、回到整个应用程序的入口,也就是main函数,除了传统Qt应用的实现之外,还需要添加一下CEF入口相关(也就是我们上一小节封装好的QCefContext)的实现:

20、至此,我们的浏览器应用初版终于完成了。运行一下看看效果:

21、本节所涉及到的组件及其流程可以总结为下面的时序图:

22、有关基于CEF的浏览器基本功能的实现,就讲解到这里了。下一节我们将介绍如何基于CEF实现浏览器与页面的互相通信。

23、 [1] Chromium Embedded Framework官网

24、 [2] Chromium Embedded Framework官方教程

好了,本文到此结束,如果可以帮助到大家,还望关注本站哦!

声明:信息资讯网所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流,版权归原作者东方体育日报所有。若您的权利被侵害,请联系 删除。

本文链接:http://www.gdxhedu.com/news/125513.html