实现基于CEF框架的客户端

举报
黑兔子 发表于 2022/09/15 11:26:15 2022/09/15
【摘要】 实现一个加载指定网址的客户端。需要在客户端内完成网页的加载、跳转、下载、打印等功能。基本上类似于做一个加载指定网址的浏览器客户端。

背景

因为工作需要,现在需要实现一个加载指定网址的客户端。需要在客户端内完成网页的加载、跳转、下载、打印等功能。基本上类似于做一个加载指定网址的浏览器客户端。

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的官网是:“https://bitbucket.org/chromiumembedded/cef/wiki/Home” 。

打开是这样的:

image.png

预编译文件下载

CEF官方提供了Linux(32/64/ARM/ARM64)、MacOS X 64、Win32、Win64平台的预编译好的库文件供下载,下载地址为:“http://opensource.spotify.com/cefbuilds/index.html” 。

cef源码编译

1.下载cef包。

cef的下载网址: “https://cef-builds.spotifycdn.com/index.html” (可以在输入框输入你要查找的版本号进行查找。)

image.png

点击链接下载到本地并解压。
image.png

这里选择的是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”

2.下载并安装CMake工具。

CMake下载地址:“https://cmake.org/download/”

image.png

这里下载的是:

image.png

3.生成cef的.sln工程文件。

  • 打开安装好的CMake工具。
  • 选择加压好的cef文件夹目录。
  • 选择生成目录。(在cef文件夹下创建一个build文件夹,如果没有自己创建,CMake会按照路径自动进行创建)
    image.png
  • 点击Configure。弹出配置窗口进行选项配置。
    image.png

选择自己需要使用的VS的版本,系统的位数等信息。我这里用的是VS2017,生成32位的工程。选择好后点击Finish。

如果遇到Configure报红:
image.png

改为:
image.png
注意:这里的CMAKE_INSTALL_PREFIX的Value值最好选择不是C:盘的路径,可以带中文。因为如果是C:盘,则启动VS时可能需要选择管理员方式打开。

再次点击Configure:
image.png

  • 点击Generate。 这时打印信息最后显示 Configuring done 和 Generate done 就表示成功了。
  • 查看生成的工程文件。 在我们创建的build文件夹下会生成cef.sln等文件。
    1657688898516.png

至此,cef源码生成完成。

4.VS打开cef工程进行全部编译。

注意: 为了避免cef工程编译失败,一定要在CMake阶段注意选择的VS的版本和系统位数的信息是否正确,如果不正确,那么这一步会导致失败。VS2017+Qt5.14.2的运行环境的配置可以在我之前的文章中找到,这里直接进行编译工作。

  • 打开cef.sln工程。

image.png

  • 点击选中ALL_BUILD,右键选择生成。

此时会编译失败。需要全局搜索"か",将CefString markedText(“か”)替换为CefString markedText(demo");

  • 再次选中ALL_BUILD,右键选择清理,然后选择重新生成。

这时工程编译成功。

  • 运行cefsimple查看运行结果。

需要将simple_app.cc文件中的代码 “http://www.google.com” 替换为 “http://www.baidu.com” 。
image.png

至此,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库才可以。


Qt Creator创建CefBrowserDemo

1.新建一个Qt项目。

这里将项目名称命名为CefBrowserDemo。这里实现了在Qt Creator创建一个项目,移植cefsimple到项目中。

2.将所需的cef文件添加到项目中。

所需的cef文件上面步骤已经生成好了。需要配置:

  • 将cef目录下的include文件夹拷贝到项目.pro文件所在的路径中。

  • .pro文件路径下新建lib文件夹。将cef目录下的libcef_dll_wrapper.lib以及libcef.lib拷贝到新项目的lib目录下。

  • 将cefsimple项目文件添加到.pro文件所在的路径下。
    image.png

  • 打开.pro文件,引入所需文件及路径。(红框框起来的部分都是必须要添加的)
    image.png

  • 因为项目的路径改变了,需要将代码中所有的#include "cefsimple/simple_handler.h"替换为#include “simple_handler.h”。

  • 将VS打开的cefsimple项目中的cefsimple_win.cc文件里面的wWinMain函数中的内容复制到CefBrowserDemo的main.cpp的main函数中,并稍作修改。
    image.png

这里去掉了有关cef_sandbox的相关内容。因为Qt Creator只支持动态库,而cef自带的cef_sandbox.lib是静态库,所以不能兼容。

  • 还要将cefsimple demo运行目录下的文件拷贝到CefBroserDemo的运行路径下,除了cefsimple文件外,其余全部拷贝在QtWidgetCef的生成目录下。

这是cefsimple demo运行目录:
image.png

这是复制后的CefBroserDemo的运行目录:
image.png

至此,CefBroserDemo就可以编译运行成功了。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。