Qt 6.2.2 + libCef Demo

先看看效果如何:

1.如何集成

1.1 目录整理

在编译好libCef文件之后,我们需要对文件目录做一些整理。

  • libCef的include头文件
  • libCef编译的二进制文件
  • 自己的源码目录

使用vs2019创建Qt项目,这里我就略过。

最后目录格式如下所示:

│  QCefWindow.sln
│  QSimpleCef.vcxproj
│  QSimpleCef.vcxproj.filters
│
├─bin
│  ├─debug
│  │  │  chrome_100_percent.pak
│  │  │  chrome_200_percent.pak
│  │  │  ...
│  │
│  └─release
│      │  cef_sandbox.lib
│      │  chrome_100_percent.pak
│      │  chrome_200_percent.pak
│      │  ...
│
├─include
│  │  cef_accessibility_handler.h
│  │  cef_api_hash.h
│  │  cef_string_visitor.h
│  │  ...
│  │
├─res
│  │  app.manifest
│  │  qtwidgetsapplication1.qrc
│  │
│  ├─images
│  └─ui
│          qtwidgetsapplication1.ui
│
└─sourcemain.cppqtwidgetsapplication1.cppqtwidgetsapplication1.h...

2.重点代码解释

在这个简单的demo有几处重点需要解释下:

/*** 初始化QT以及CEF相关*/
int init_qt_cef(int& argc, char** argv)
{const HINSTANCE h_instance = static_cast<HINSTANCE>(GetModuleHandle(nullptr));CefMainArgs main_args(h_instance);CefRefPtr<SimpleApp> app(new SimpleApp); //CefApp实现,用于处理进程相关的回调。const int exit_code = CefExecuteProcess(main_args, nullptr, nullptr);if (exit_code >= 0){return exit_code;}// Parse command-line arguments for use in this method.CefRefPtr<CefCommandLine> command_line = CefCommandLine::CreateCommandLine();command_line->InitFromString(::GetCommandLineW());// 设置配置CefSettings settings;settings.multi_threaded_message_loop = true; //多线程消息循环settings.log_severity = LOGSEVERITY_DEBUG; //日志settings.no_sandbox = true; //沙盒if (command_line->HasSwitch("enable-chrome-runtime")) {// Enable experimental Chrome runtime. See issue #2969 for details.settings.chrome_runtime = true;}bool result = CefInitialize(main_args, settings, app.get(), nullptr);return -1;
}

2.1 多进程架构

因为libCef是多进程架构,所以下面的这条语句就会进来多次。

比如:看我的机器上的进程
这里的SimpleApp是个什么东西,文档解释说提供进程级别的回调。好,我也是看的一脸懵逼。不过我暂且不着急去理解,我想随着深入的去做,我后面在来解释。

CefRefPtr<SimpleApp> app(new SimpleApp); //CefApp实现,用于处理进程相关的回调。const int exit_code = CefExecuteProcess(main_args, nullptr, nullptr);
if (exit_code >= 0)
{return exit_code;
}

2.2 消息循环设置

设置多线程消息循环,这样是为了让libCef可以集成到我们的Qt框架。

settings.multi_threaded_message_loop = true; //多线程消息循环

从这里可以发现一个很有趣的现象,那就是这个demo中会有两个UI线程。

  • libCef有自己的ui线程
  • Qt有自己的ui线程

所以如果你去看libCef的代码,你就会发现很多CefCurrentlyOn(TID_UI) 这种语句的判断,就是在检查是否是在libCef的UI 线程环境中。

如果不是就会Post Task过去,通知libCef UI线程去做。因为我们不能直接Qt的UI线程去修改libCef的UI,多线程操作UI是不安全的。

Tip:

这里我们使用了libCef的多线程消息循环,在最后libCef退出的时候,不能在调用 CefQuitMessageLoop()退出消息

2.3 日志的设置

日志的设置是非常重要的,我把它设置为DEBUG级别的。会在运行目录下生成一个debug.log文件。

settings.log_severity = LOGSEVERITY_DEBUG; //日志

2.4 沙盒

因为是MD模式编译,所以沙盒就没法用了。更多信息参考之前的文章

settings.no_sandbox = true; //沙盒

2.5 simple_hanler和simple_app

其实这两个类并不是我自己的写的,而是我从libCef中的Demo中直接复制过来的。

我们先看simple_handler.h从头文件来看,就是继承了各种父类,然后去重写它们的虚函数

比如:

CefClient提供访问Browser实例的回调接口

CefLifeSpanHandler对Browser生命周期(Browser Life Span),比如:browser create ,browser destory

CefDisplayHandler 对浏览器上面的ui变化,比如:title change, address change…

CefLoadHandler浏览器上面的加载状态的变化,比如:load start, load end, load error…

class SimpleHandler : public CefClient,public CefDisplayHandler,public CefLifeSpanHandler,public CefLoadHandler

CefApp接口提供了不同进程的可定制回调函数,比如:渲染进程,GPU进程的回调事件

class SimpleApp : public CefApp, public CefBrowserProcessHandler

这个暂且就解释到这里,随着后面的深入我在解释。

其实我个人感觉,如果只是在应用层借助libCef开发,我们主要做得事情就是继承各种class,实现虚函数,然后被框架调用。

说的简单点:就是实现各种回调函数

最后,我把源码 已经上传到gitee了,有兴趣的同学可以下载跑下看看效果。

项目地址:https://gitee.com/liushixiong/qcef-window

下一节,我会说明 Check failed: !IsCefShutdown(). Object reference incorrectly错误原因

Qt6.2.2+libCef Demo相关推荐

  1. Qt+QtWebApp开发笔记(一):QtWebApp介绍、下载和搭建基础封装http轻量级服务器Demo

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/130631547 红胖子网络科技博文大全:开发技术集合( ...

  2. 04 Qt音视频多媒体播放器开发,Qt6.2.3 multimedia

    Q6.2.3 multimedia 音视频多媒体播放器开发 步骤: Qt6.2版本中已经有了播放器的Demo,亲测可用.先下载Qt并安装Qt6.2.3,或者更新到Qt6.2.3,直接在欢迎页找到Med ...

  3. vs2017下libcef配置

    目录 1.应用背景 2.下载CEF 3.编译 libcef_dll_wrapper 4.新建MFC对话框程序 5.运行程序 6.OK,好了 1.应用背景 随着 HTML5 的崛起和 IE 的淘汰,微软 ...

  4. windows10下QT6.4.3编译qsqlmysql Debug+Release动态库

    QT6版本以上没有mysql的动态库,需要自己编译,网上找了好多教程都没有成功编译,后面结合多个教程慢慢倒腾 终于成功了,具体操作步骤如下: 1,首先下载安装QT的时候 需要安装它的源码 2,安装完成 ...

  5. Qt6教程之三(14) 串口通信

    目录 一 串口通信相关概念介绍 二 Qt开发串口通信程序 一 串口通信相关概念介绍 串口通信(Serial Communications)在上位机控制领域非常常用,其原理是按位(bit)发送和接收字节 ...

  6. 01 Qt6.2.3播放YUV视频,使用QOpenGLWidget

    Qt6.2.3播放YUV视频,使用QOpenGLWidget 作者 将狼才鲸 创建日期 2022-03-30 工程Gitee源码地址:qt_gui_simple2complex/ source / 0 ...

  7. Qt6 QML TreeView 基本使用

    Qt6.3 终于新增了一个 TreeView,之前 Controls1 中的 TreeView 废弃后,一直没出新的 TreeView 组件.先不说这个新的 TreeView 是继承自 TableVi ...

  8. jquery autocomplete demo

    根据用户输入值进行搜索和过滤,让用户快速找到并从预设值列表中选择. jquery.autocomplete参考地址 http://bassistance.de/jquery-plugins/jquer ...

  9. BERT-Pytorch demo初探

    https://zhuanlan.zhihu.com/p/50773178 概述 本文基于 pytorch-pretrained-BERT(huggingface)版本的复现,探究如下几个问题: py ...

  10. MinkowskiEngine demo ModelNet40分类

    MinkowskiEngine demo ModelNet40分类 本文将看一个简单的演示示例,该示例训练用于分类的3D卷积神经网络.输入是稀疏张量,卷积也定义在稀疏张量上.该网络是以下体系结构的扩展 ...

最新文章

  1. [转]Iphone NSString字符串常用方法
  2. Docker相关的项目
  3. 字节,腾讯,百度... Go 工程师面试题大公开
  4. 解析.DBC文件, 读懂CAN通信矩阵,实现车内信号仿真
  5. 水抗攻击(APT攻击手段)
  6. 信息学奥赛一本通 2035:【例5.2】平移数据
  7. sleep与信号唤醒的问题 内核对信号的处理方式 udelay
  8. java structs_Java之Structs框架初探
  9. 手机版kali Linux教程(质量高)
  10. 矩阵转置+矩阵相加(三元组)
  11. 美还是丑?这有一个CNN开发的颜值评分器 | 实战
  12. [论文解读] A Ranking-based, Balanced Loss Function Unifying Classification and Localisation in Object De
  13. 钉钉如何群里定时发送文件_使用钉钉APP实现多人在线协同编辑文档
  14. OSChina 周四乱弹 ——程序员要赚多少钱才能让妻子保持温柔和美丽
  15. 开发一个渐进式Web应用程序(PWA)前都需要了解什么?
  16. d^3CTF web部分wp
  17. Win10 0x80190001错误解决
  18. C与C++成长之路——c提高二之指针强化和字符串
  19. UE4中部分物理概念的单位
  20. mysql数据库中插入表信息_mysql数据库中插入表

热门文章

  1. Cisco Packet Tracer教程
  2. teamviewer 服务器系统,远程支持服务器搭建teamviewer
  3. 计算机教室管理员应知应会,教室管理
  4. 单台服务器部署桌面虚拟化,桌面虚拟化部署最重要的一个环节?!
  5. Cell Ranger
  6. Oracle数据库如何收费
  7. win10计算器rsh_如何打开win10计算器 教你打开win10计算器的方法
  8. detours介绍与使用
  9. 电脑连接校园网不自动跳转到登录界面
  10. 2021年关于Delphi/Object Pascal编程语言的现状和历史