因为工作需要,现在需要实现一个加载指定网址的客户端。需要在客户端内完成网页的加载、跳转、下载、打印等功能。基本上类似于做一个加载指定网址的浏览器客户端。
Qt有自带的两个用来开发浏览器的模块,一个是QWebKit,一个是QWebEngine。QWebKit在Qt5.6之后已经被废弃了,转而使用基于chromium内核、性能更好、问题更少的QWebEngine。
但是即使是QWebEngine,也有一些功能没有办法实现,比如网页中调用js的window.print()方法时,可以捕捉到信号,但是目前没有办法获取到打印的内容(如果有大神肯赐教,可以留个言)。
而基于cef开发的浏览器时可以实现这个功能的,只不过现在封好的cef是基于c#的。所以现在想实现c++接口、Qt界面、cef框架的浏览器。
CEF浅了解:CEF是Chromium Embedded Framework 的简写,是一个把 Chromium 嵌入其他应用的框架。这是个开源项目,是由Marshall Greenblatt 在 2008 年创立的,由C/C++编写而成,它通过提供稳定的API来避免开发者被 Blink、V8、Chromium 等复杂的代码逻辑所困扰。
CEF以开源库的方式提供,可以内嵌到第三方程序中用于显示网页以及和网页进行交互。
CEF支持Windows, Linux, Mac平台。除了提供C/C++接口外,也有其他语言的移植版。
CEF因为基于Chromium,所以CEF支持Webkit&Chrome中实现的HTML5的特性,并且在性能上面,也比较接近Chrome。
CEF还提供的如下特性:自定义插件、自定义协议、自定义JavaScript对象和扩展;可控制的resource loading, navigation, context menus等等。
很多大家耳熟能详的桌面端应用都在使用 CEF 框架:QQ桌面端、微信桌面端、网易云音乐桌面端、 MATLAB 、 FoxMail 、OBS Studio 等。
CEF的官网:CEF的官网是:“[url=]https://bitbucket.org/chromiumembedded/cef/wiki/Home[/url]” 。
打开是这样的:
预编译文件下载CEF官方提供了Linux(32/64/ARM/ARM64)、MacOS X 64、Win32、Win64平台的预编译好的库文件供下载,下载地址为:“[url=]http://opensource.spotify.com/cefbuilds/index.html[/url]” 。
cef源码编译1.下载cef包。cef的下载网址: “[url=]https://cef-builds.spotifycdn.com/index.html”[/url] (可以在输入框输入你要查找的版本号进行查找。)
点击链接下载到本地并解压。
这里选择的是windows32位的 cef_binary_89.0.18+gb36241d+chromium-89.0.4389.114_windows32.tar.bz2。
下载cef包时要注意编译环境是否支持。
cef 版本对应编译环境详细信息可以查看此链接:“https://blog.csdn.net/evesmith520/article/details/124847427”
CMake下载地址:“[url=]https://cmake.org/download/”[/url]
这里下载的是:
3.生成cef的.sln工程文件。选择自己需要使用的VS的版本,系统的位数等信息。我这里用的是VS2017,生成32位的工程。选择好后点击Finish。
如果遇到Configure报红:
改为:
注意:这里的CMAKE_INSTALL_PREFIX的Value值最好选择不是C:盘的路径,可以带中文。因为如果是C:盘,则启动VS时可能需要选择管理员方式打开。
再次点击Configure:
至此,cef源码生成完成。
4.VS打开cef工程进行全部编译。注意: 为了避免cef工程编译失败,一定要在CMake阶段注意选择的VS的版本和系统位数的信息是否正确,如果不正确,那么这一步会导致失败。VS2017+Qt5.14.2的运行环境的配置可以在我之前的文章中找到,这里直接进行编译工作。
此时会编译失败。需要全局搜索"か",将CefString markedText(“か”)替换为CefString markedText(demo");
这时工程编译成功。
需要将simple_app.cc文件中的代码 “[url=]http://www.google.com[/url]” 替换为 “[url=]http://www.baidu.com[/url]” 。
至此,cef工程编译完成。以上实现了cef库的编译运行,主要是为了生成我们嵌入cef模块时所需要的libcef_dll_wrapper.lib文件。
如果实在Qt Creator上创建的项目想要嵌入cef模块,那么还需要一个步骤。
上面编译生成了libcef_dll_wrapper.lib静态库,默认使用的是MTd的链接方式,而Qt中常使用的是动态链接(即MDd),所以需要使用MDd的方式重新编译libcef_dll_wrapper.lib。
右键项目libcef_dll_wrapper->属性->C/C+±>代码生成->运行库:改为“多线程调试 DLL (/MDd)”(如果是release版,则改为“多线程 DLL (/MD)”)。然后重新生成就可以了。
注意: Qt Creator创建的嵌入cef功能的项目,debug运行加载的页面是空白的(有问题),所以只能创建release版本。
所以这一步如果是VS创建的项目,则生成debug和release的lib库都可以。
如果项目是Qt Creator创建的,只能生成release版本的lib库才可以。
这里将项目名称命名为CefBrowserDemo。这里实现了在Qt Creator创建一个项目,移植cefsimple到项目中。
2.将所需的cef文件添加到项目中。所需的cef文件上面步骤已经生成好了。需要配置:
将cef目录下的include文件夹拷贝到项目.pro文件所在的路径中。
.pro文件路径下新建lib文件夹。将cef目录下的libcef_dll_wrapper.lib以及libcef.lib拷贝到新项目的lib目录下。
将cefsimple项目文件添加到.pro文件所在的路径下。
打开.pro文件,引入所需文件及路径。(红框框起来的部分都是必须要添加的)
因为项目的路径改变了,需要将代码中所有的#include "cefsimple/simple_handler.h"替换为#include “simple_handler.h”。
将VS打开的cefsimple项目中的cefsimple_win.cc文件里面的wWinMain函数中的内容复制到CefBrowserDemo的main.cpp的main函数中,并稍作修改。
这里去掉了有关cef_sandbox的相关内容。因为Qt Creator只支持动态库,而cef自带的cef_sandbox.lib是静态库,所以不能兼容。
这是cefsimple demo运行目录:
这是复制后的CefBroserDemo的运行目录:
至此,CefBroserDemo就可以编译运行成功了。
欢迎光临 firemail (http://firemail.wang:8088/) | Powered by Discuz! X3 |