01. QCefView简介

本文介绍了QCefView,一个轻量级的Qt组件,它允许无缝集成Chrome嵌入式框架。通过实例展示如何构建、配置并利用它实现Qt与Web的双向通信。重点讲解了Qt调用JS和JS调用Qt的核心代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

官方网址:http://tishion.github.io/QCefView/

Github地址:https://github.com/tishion/QCefView

目录

1. 什么是QCefView

2. 为什么使用QCefView

3. 构建QCefView

3.1 检出QCefView的源码;

3.2 部署Qt SDK

3.3 下载CEF二进制发行文件 (可选)

04. 运行QCefViewTest,初识QCefView

05. 通讯核心代码

5.1 Qt 调用 JS

5.2 JS调用Qt


1. 什么是QCefView

QCefView是一个与Chrome嵌入式框架(Chromium Embedded Framework)集成的Qt小部件。 您可以使用QCefView而无需编写任何与CEF代码相关的代码。 这个Qt小部件是分布在二进制模块和LGPL许可的。

 

2. 为什么使用QCefView

有一些用CEF开发的UI框架,比如Electron等。 但Electron与CEF封装在一起,您只能通过编写JavaScript代码来开发您的应用程序。 如果您需要在应用程序中使用本机代码,同时还需要CEF,那么Electron在这种情况下并不是一个好的选择。 你完全可以自己完成整合,因为你需要做很多关于网页代码和本地代码之间通信的工作。 大多数时候这是重复的工作。

现在您可以尝试使用QCefView来开发您的应用程序。 像使用其他QWidgets一样使用它。 QCefView小部件提供了几种方法来在本地C ++代码和Web代码之间进行通信。 您不需要编写通信业务逻辑。

 

3. 构建QCefView

3.1 检出QCefView的源码;

└─QCefView-master
    │  CMakeLists.txt
    │  config.cmake
    │  License
    │  readme.md
    ├─.github
    ├─dep
    ├─src
    │  ├─QCefProto
    │  ├─QCefView
    │  │  ├─CefViewBrowserApp
    │  │  │  ├─BrowserDelegates
    │  │  │  └─SchemeHandlers
    │  │  └─Include
    │  └─QCefWing
    │      └─CefViewRenderApp
    │          └─RenderDelegates
    └─test
        └─QCefViewTest

 

3.2 部署Qt SDK

qt download: https://download.qt.io/archive/qt/

由于Qt和Visual Studio有不同的版本,因此您需要确定要在开发中使用的Qt和Visual Studio的版本。 如您所知,一旦您使用指定版本的Visual Studio安顿下来,您必须使用相应版本的Qt SDK。

3.3 下载CEF二进制发行文件 (可选)

下载的源码中默认会有一个构造依据的版本,如果没有自己的特殊需求,可以忽略本步骤,如果有,需要将dep目录中加入对应文件

 root
 ├─dep
 │  └─cef_binary_76.1.13+gf19c584+chromium-76.0.3809.132_windows64
 ├─src
 └─test

3.4 修改 config.cmake 中对应的配置项

主要是这个QTDIR的配置,配置到自己的实际路径中

3.5 使用CMake构建项目

mkdir build.win && cd build.win
cmake .. && cmake --build .

构建成功后,会在项目根目录下,生成out文件夹,结构如下:

D:\QCEF\QCEFVIEW-MASTER\OUT
├─QCefView
│  ├─bin           # 运行时文件,动态库,exe
│  │  ├─Debug
│  │  └─Release
│  ├─include       # 头文件
│  └─lib           # 静态库
│      ├─Debug
│      └─Release
└─QCefViewTest    # 测试项目
    ├─Debug
    └─Release

 

编译报错处理:

  1. 如果QT版本与源码中版本使用的一些代码不匹配,可能会导致报错,这时需要修改源码。我本地用的5.6,关于QMetaObject::invokeMethod和一些Lamda的一些用法不同,按标准语法改下就行了。
  2. 另外我下的版本中,源码中QCefEvent的使用有点问题,按源码修改下编译即可。

04. 运行QCefViewTest,初识QCefView

运行QCefViewTest,效果如下:

左侧是Qt Widget,右侧是Web页面。

点击左侧ChangeColor,右侧背景色会变,实现了从Qt到Web的通讯

点击右侧Invoke Method,会调起Qt的对应函数,实现Web到Qt的通讯。

具体方式按Test源码即可。

 

05. 通讯核心代码

QCefView通讯核心是依赖Web页面中注入的QCefClient对象与QCefView界面之间的调用实现的。

5.1 Qt 调用 JS

Qt端:

通过broadcastEvent(const QCefEvent& event)触发一个事件消息到所有Frame。

查看源码可知,除了广播外,也支持触发事件到特定Frame,这里不过多介绍。

QCefEvent封装了事件名,属性等信息。

调用方式如下:

void CustomCefView::changeColor()
{
  QColor color(255,0,0);

  QCefEvent event("colorChange");
  event.setStringProperty("color", color.name());
  broadcastEvent(event);
}

JS端:

通过QCefClient.addEventListener(eventName, callfunction)对事件进行监听调用。

代码如下:

function onColorChanged (event) {
    document.getElementById("main").style.backgroundColor = event["color"];
}
        
function onLoad() {
  if (typeof(QCefClient) == 'undefined') { 
    return;
  }
                
  QCefClient.addEventListener("colorChange", onColorChanged)
}

 

5.2 JS调用Qt

QCefView官方提供调用方式有三种,重点关注下面这个即可。

JS端:

JS调用Qt通过QCefClient.invokeMethod反射调用Qt的对应监听函数。

代码如下:

function onInvokeMethodClicked() {
  QCefClient.invokeMethod("TestMethod", 1, false, "arg3");
}

Qt端:

统一通过onInvokeMethodNotify函数接收实践,并根据method和QMetaObject::invokeMethod反射调用到对应函数。

代码如下:

void CustomCefView::onInvokeMethodNotify(int browserId, int frameId, const QString& method, const QVariantList& arguments)
{
  QMetaObject::invokeMethod(this, "testOnInvokeMethodNotify", Qt::QueuedConnection, Q_ARG(QString, method));
}

 

 

<think>嗯……用户想了解QCefView的使用指南或问题解决方案,结合刚才引用的几篇资料来看,信息还挺零散的。用户应该是个开发者,正在集成这个Qt封装CEF组件时遇到困难。从引用[1][3]看,基本使用步骤其实很清晰:先编译库→包含头文件→创建实例→加载内容。引用[4]提到的加载慢问题特别实用,尤其是网络代理和缓存设置这两点——很多开发者容易忽略CEF底层其实是Chromium内核,需要像配置浏览器一样配置它。用户没有具体说明遇到什么类型的问题,可能是刚接触QCefView。需要区分场景:如果还在环境搭建阶段,重点给编译指南;如果是运行时问题,就要像引用[1]那样分步骤排错。那个Python伪代码示范很妙,虽然QCefViewC++库,但流程图示能让用户更快理解生命周期。突然想到引用[2]提到的跨平台特性很重要,应该单独强调。有开发者可能在Linux上遇到依赖问题,但引用资料里没提解决方案……要不要补充?不过既然用户没问具体平台,暂时搁置吧。相关问题设置成阶梯状比较合理:从安装→基础使用→高级优化→底层原理,这样无论用户处于哪个阶段都能找到入口。最后那个“性能优化建议”其实埋了钩子——如果用户接着问FPS或者内存泄漏,就能深入讨论渲染进程隔离机制了。</think> 以下是关于QCefView的使用指南和问题解决方案的整理,结合多个引用内容整理成结构化说明: --- ### **QCefView 基础使用指南** 1. **环境准备** - 确保已正确编译QCefView库(Windows/macOS/Linux均支持)[^2][^3] - 项目地址:https://gitcode.com/gh_mirrors/qc/QCefView 2. **集成步骤** ```cpp // 1. 包含头文件 #include <QCefView.h> // 2. 创建实例(需在QWidget容器中) QCefView* cefView = new QCefView(parentWidget); // 3. 初始化并加载内容 cefView->navigateToUrl("https://example.com"); // 加载URL // 或 cefView->setHtml("<html>...</html>"); // 加载HTML ``` --- ### **常见问题解决方案** #### 问题1:网页加载速度慢 [^4] - **可能原因**: - 系统网络代理设置冲突 - CEF未启用页面缓存(首次加载慢) - 网页资源本身加载缓慢 - **解决方法**: 1. 关闭网络设置的 *“自动检测代理”* 选项 2. 启用CEF缓存(需在初始化时配置): ```cpp QCefConfig config; config.setCachePath("/path/to/cache"); // 设置缓存目录 cefView->initialize(config); ``` 3. 使用开发者工具(Waterfall)分析资源加载瓶颈 #### 问题2:运行时错误 [^1] - **排查步骤**: 1. 验证QCefView库编译版本与项目架构(x86/x64)一致 2. 检查CEF资源文件(如 `locales`、`resources`)是否部署到可执行文件同级目录 3. 确保初始化顺序:先创建 `QApplication`,再初始化QCefView #### 问题3:跨平台兼容性 [^2] - QCefView基于 **CefViewCore**(与框架无关的CEF核心封装),需注意: - Windows:需携带 `libcef.dll` 及资源文件夹 - Linux:安装依赖 `libx11-dev`,`libgtk-3-dev` - macOS:需在 `Info.plist` 中配置 `NSAppTransportSecurity` --- ### **高级功能** - **自定义事件处理**: 重写 `QCefView` 的虚拟函数处理JS消息、页面生命周期事件: ```cpp virtual void onLoadStart() override; // 页面开始加载 virtual bool onJSCallback(const QString& message); // 处理JS回调 ``` - **多进程模式**: 默认启用CEF多进程架构,通过 `QCefConfig::setEnableGPU(true)` 启用GPU加速渲染。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值