Qt通过QCefView使用libcef

1.下载libcef:

http://opensource.spotify.com/cefbuilds/index.html#windows64_builds(Standard Distribution)

2.下载QCefView:

https://github.com/tishion/QCefView(efc4c55)

3.QCefView安装指导

https://tishion.github.io/QCefView/
总结起来分下面几个步骤:

  • 下载libcef,编译libcef_dll_wrapper.lib
  • 将libcef库文件拷贝到dep\cef文件夹下,按照dep\cef\Readme中说明拷贝
  • 编译QCefView
4.编译libcef

cmake生成vs2017工程,打开cef.sln,分别使用debug和release生成解决方案,生成后提示ceftests工程生成失败可忽略

5.编译QCefView

将工程修改成vs2017环境,设置本地Qt版本号,编译、生成、运行过程中出现以下错误

(1)编译出现qcefviewdefaultschemehandler.cpp(115): error C2660: “CefSchemeRegistrar::AddCustomScheme”: 函数不接受 7 个参数

最新的libcef只需要2个参数,修改成

return registrar->AddCustomScheme(scheme_name, false);
(2)编译运行QCefViewTest,出现无法找到QCefView.dll

项目属性->调试->环境中添加$(SolutionDir)QCefViewSDK\bin\Debug

(3)程序异常终止 Expression: __acrt_first_block == header

单步调试发现,在QCefView项目中CCefSetting.cpp第42行当这句话步过时就会崩溃
image
写个简单的测试
image
调试发现str_std离开大括号作用域程序立即崩溃,在Qt官方的bugreports寻找答案,看到有人提出过类似的问题 https://bugreports.qt.io/browse/QTBUG-63274,官方貌似说这不是bug,是编译器造成的,去Microsoft官方文档找答案(笑)。没办法不使用toStdString,换种写法避免这个问题,将QCefView工程中所有使用toStdString的地方(一共18处)换成toLocal8Bit,并使用std::string构造,例如

browser_sub_process_path.FromString(
		std::string(QDir::toNativeSeparators(strExePath).toLocal8Bit()));
(4)ERROR:icu_util.cc(172)] Invalid file descriptor to ICU data received.

没有找到icu数据文件,将resources文件夹下的icudtl.dat拷贝到QCefViewSDK\bin\Debug目录下,并将resources整个文件夹拷贝到QCefViewTest项目下,QCefViewSDK\bin\Debug下的qtcefwing.exe也拷贝到QCefViewTest项目下,不然会出现渲染错误

(5)Check failed: fallback_available == base::win::GetVersion() > base::win::VERSION_WIN8 (1 vs. 0)

将libcef目录下cef_binary_74.1.16+ge20b240+chromium-74.0.3729.131_windows64\tests\cefsimple中的cefsimple.exe.manifest和compatibility.manifest拷贝到QCefView和qtcefwing两个工程目录下,并将QCefView项目中的cefsimple.exe.manifest重命名为QCefView.dll.manifest,将qtcefwing项目中的cefsimple.exe.manifest重命名为qtcefwing.exe.manifest,设置QCefView项目的生成后事件,属性->生成事件->生成后事件->命令行中在xcopy命令前加入以下代码:

setlocal

mt.exe -nologo -manifest "compatibility.manifest" "QCefView.dll.manifest" -outputresource:"$(OutDir)QCefView.dll";#2

if %errorlevel% neq 0 goto :cmEnd

:cmEnd

endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone

:cmErrorLevel

exit /b %1

:cmDone


if %errorlevel% neq 0 goto :VCEnd

设置qtcefwing项目的生成后事件,属性->生成事件->生成后事件->命令行中加入以下代码:

setlocal

mt.exe -nologo -manifest "compatibility.manifest" "qtcefwing.exe.manifest" -outputresource:"$(OutDir)qtcefwing.exe";#1

if %errorlevel% neq 0 goto :cmEnd

:cmEnd

endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone

:cmErrorLevel

exit /b %1

:cmDone

 

if %errorlevel% neq 0 goto :VCEnd

重新生成解决方案,生成完后,重新将qtcefwing.exe拷贝到QCefViewTest项目中

(6)Terminating renderer for bad IPC message, reason 205

文件路径不对,修改qcefviewtest.cpp中cefview创建时传入的文件路径

QDir dir = QDir::current();
QString uri = QDir::toNativeSeparators(dir.filePath("QCefViewTestPage.html"));
cefview = new CustomCefView(uri/*"http://www.sina.com"*/, this);
(7)FATAL:interface_ptr_state.cc(83)] Check failed: runner_->RunsTasksInCurrentSequence()

这个貌似是vpn代理造成的,release下不会出现这个问题,debug下有两种选择,不使用vpn或者使用全局vpn代理(应用程序也能上梯子)

下载修改后的工程

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
QCEFView是基于Qt和Chromium Embedded Framework(CEF)的浏览器控件。它可以在Qt应用程序中嵌入一个完整的浏览器窗口,允许用户浏览网页、执行JavaScript代码等。 QCEFView的优势之一是它能够提供高性能的网页渲染和JavaScript执行。由于基于CEF,它可以利用Chromium引擎的功能和优化,提供流畅的浏览体验。 另一个优点是QCEFView的灵活性。它可以与Qt的图形界面框架完美集成,允许开发者根据自己的需求自定义浏览器窗口的外观和行为。开发者可以通过信号和槽机制与QCEFView进行交互,实现诸如加载URL、执行JavaScript代码、获取网页的标题和内容等操作。 同时,QCEFView还可以集成其他Qt组件和功能。例如,可以将QCEFViewQt的网络模块结合使用,实现浏览器的网络功能;也可以与Qt的文件系统模块结合使用,实现浏览器的文件操作功能等。 当然,使用QCEFView也存在一些注意事项。首先,QCEFView的集成可能会增加应用程序的大小和内存占用,因为Chromium引擎是一个相对庞大的库。其次,由于CEF是基于多进程架构的,QCEFView使用时需要注意处理进程间通信的问题。 总的来说,QCEFView是一个强大且灵活的Qt嵌入式浏览器控件,能够为开发者提供良好的浏览体验和自定义能力。无论是用于开发嵌入式浏览器应用程序还是添加浏览器功能到现有Qt应用程序中,QCEFView都是一个不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值