qcefview库的使用

news/2025/10/24 17:11:45/文章来源:https://www.cnblogs.com/wuya178/p/19163818

目录
  • 背景
  • 运行环境
  • qcefview源码阅读
    • 代码目录
    • 代码结构
    • 列举的通讯方式
      • 通讯方式一,widget中的函数通知web页面改变
    • 通讯方式二、鼠标拖拽事件
    • 通讯方式三、c++中invoke函数响应(两种UrlRequest、QueryRequest)
    • QCefView中定义的其他方法
  • 实践

背景

调研在qt中使用web技术的几种方式,cef3可以单独升级谷歌内核。qcefview是封装了qt和web通信的库。

运行环境

qt5.15.2: qt4.8不支持的太多,qt5.9不支持用例里的随机数类等
vs2017: 2010内置的msvc编译器不支持c++11的Mutex等
qcefview: 2021年9月3日下的github最新的压缩包
chrome内核:cef_binary_89.0.12+g2b76680+chromium-89.0.4389.90_windows32
cmake:准备好代码和目录后直接运行自带的cmake脚本生成工程文件,直接编译成功没其他问题。

qcefview源码阅读

利用了qt元对象系统的反射技术。
qml中调用c++的方法也是一样的,c++注册函数为Q_INVOKABLE...

代码目录

除了chromium的源码外,这个项目代码量都不大,文件二三十个。

                                                                         +--------------------------------------------------------------+       | QCefViewTest                                                 |       |    列举了几种通讯方式                                          |       |    +----------------------------------------------------+    |       |    | QCefView(windows)                                  |    |       |    |  封装了对应QCefWindow的操作主要是QCefView类          |    |       |    |    +-------------------------------------------+   |    |       |    |    | CefViewCore(chromium):对chromium的操作封装 |   |    |       |    |    | 代码量不大,主要是CefViewBrowserHandler类.  |   |    |       |    |    | 该类继承自CefClient,重载了浏览器ui操作      |   |    |       |    |    |                                           |   |    |       |    |    +-------------------------------------------+   |    |       |    |                                                    |    |       |    +----------------------------------------------------+    |       |                                                              |       +--------------------------------------------------------------+       

代码结构

Outline of QCefView:                                                     +--------------------------------------------------------------+       | QCefView(QWidget)                                            |       |                                                              |       |    +----------------------------------------------------+    |       |    | WindowWrapper(QWidget)                             |    |       |    |                                                    |    |       |    |    +-------------------------------------------+   |    |       |    |    | CefWindow(QWindow)                        |   |    |       |    |    |                                           |   |    |       |    |    |                                           |   |    |       |    |    |                                           |   |    |       |    |    +-------------------------------------------+   |    |       |    |                                                    |    |       |    +----------------------------------------------------+    |       |                                                              |       +--------------------------------------------------------------+       Remarks:                                                                 The WindowWrapper and CefWindow are transparent to upper layer user.   

列举的通讯方式

也可参考CSDN博文.

通讯方式一,widget中的函数通知web页面改变

//1、连接信号槽函数connect(ui.btn_changeColor, SIGNAL(clicked()), this, SLOT(onBtnChangeColorClicked()));
//2、槽函数
QCefViewTest::onBtnChangeColorClicked()
{cefview->changeColor();
}
//3、具体执行
void
CustomCefView::changeColor()
{QColor color(0,0,0);QCefEvent event("colorChange");//QCefView封装好的event.setStringProperty("color", color.name());broadcastEvent(event);
}
//4、Implementation实例(pImpl_)
bool
QCefView::broadcastEvent(const QCefEvent& event)
{if (pImpl_)return pImpl_->triggerEvent(event.objectName(), event, CefViewBrowserHandler::ALL_FRAMES);return false;
}
//5、发送Event后js中改变主窗体背景色function onColorChanged(event) {var kvlist = [];for (var key in event) {kvlist.push(key + ":" + event[key])}alert(kvlist.join('\n'));document.getElementById("main").style.backgroundColor = event["color"];}
//跟到后面是进程间通讯了,还没看到添加listener的代码,onColorChanged是js中的函数名似乎没用function onLoad() {if (typeof (CallBridge) == 'undefined') {return;}//addEventListener注意CallBridge.addEventListener("colorChange", function (event) {var kvlist = [];//下面这段for循环啥意思for (var key in event) {kvlist.push(key + ":" + event[key])}//alert(kvlist.join('\n'));document.getElementById("main").style.backgroundColor = event["color"];})}

具体看看QCefEvent。

通讯方式二、鼠标拖拽事件

//1、js中的调用function onDragAreaMouseDown() {CallBridge.invokeMethod("onDragAreaMouseDown");}
//2、c++直接在widget中响应这个函数,重载的函数
void
CustomCefView::onInvokeMethodNotify(int browserId, int frameId, const QString& method, const QVariantList& arguments)
{//等于这个方法函数时怎么响应if (0 == method.compare("onDragAreaMouseDown")) {
#if defined(OS_WINDOWS)HWND hWnd = ::GetAncestor((HWND)(this->window()->winId()), GA_ROOT);// get current mouse cursor positionPOINT pt;::GetCursorPos(&pt);// in case the mouse is being captured, try to release it::ReleaseCapture();// simulate that the mouse left button is down on the title area::SendMessage(hWnd, WM_NCLBUTTONDOWN, HTCAPTION, POINTTOPOINTS(pt));
#endifreturn;} else if (
//3、CCefDelegate中调用
void
CCefDelegate::invokeMethodNotify(int browserId,int frameId,const std::string& method,const CefRefPtr<CefListValue>& arguments)
//分发事件中的调用CefViewBrowserHandler为继承CefClient浏览器客户端
bool
CefViewBrowserHandler::DispatchNotifyRequest(CefRefPtr<CefBrowser> browser,CefProcessId source_process,CefRefPtr<CefProcessMessage> message)

通讯方式三、c++中invoke函数响应(两种UrlRequest、QueryRequest)

在CustomCefView类中使用了几种通讯方式,用了响应web UI的交互动作。都是采用invokeMethod函数的方式响应。实现跨线程或者跨进程的通讯,在web中调用qt的响应函数。
主要实现CustomCefView类定制的交互响应函数

//函数原型
bool QMetaObject::invokeMethod ( QObject * obj, const char * member, Qt::ConnectionType type, QGenericReturnArgument ret, QGenericArgument val0 = QGenericArgument( 0 ), QGenericArgument val1 = QGenericArgument(), QGenericArgument val2 = QGenericArgument(), QGenericArgument val3 = QGenericArgument(), QGenericArgument val4 = QGenericArgument(), QGenericArgument val5 = QGenericArgument(), QGenericArgument val6 = QGenericArgument(), QGenericArgument val7 = QGenericArgument(), QGenericArgument val8 = QGenericArgument(), QGenericArgument val9 = QGenericArgument() ) [static]

具体为:

...
QMetaObject::invokeMethod(this,[=]() {QString title("QCef InvokeMethod Notify");QString text = QString("Current Thread: QT_UI\r\n""Method: %1\r\n""Arguments: ...").arg(method);QMessageBox::information(this->window(), title, text);},Qt::QueuedConnection);
...

参数二member直接用匿名函数表示实现了,注意最后打印的线程ID为web ui线程。
UrlRequest简单直接调用invokeMethod
QueryRequest多了一点

QString response = query.reqeust().toUpper();query.setResponseResult(true, response);responseQCefQuery(query);

QCefView中定义的其他方法

QCefView::Implementation实例中的定义

void closeAllBrowsers()
void addLocalFolderResource(const QString& path, const QString& url)
void addArchiveResource(const QString& path, const QString& url, const QString& password)
void navigateToString(const QString& content)
void navigateToUrl(const QString& url)
bool browserCanGoBack()
bool browserCanGoForward()
void browserGoBack()
bool browserIsLoading()
void browserReload()
void browserStopLoad()
bool triggerEvent(const QString& name, const QCefEvent& event, int frameId = CefViewBrowserHandler::MAIN_FRAME)
bool responseQCefQuery(const QCefQuery& query)
void notifyMoveOrResizeStarted()
bool sendEventNotifyMessage(int frameId, const QString& name, const QCefEvent& event)
...

// create the browser,实现了很多chrome内核的原生接口
pQCefViewHandler_ = new CefViewBrowserHandler(pCefDelegate_);

CCefManager::getInstance().initializeCef();才是对CEF真正的初始化者

实践

D:\code\qcefview\QCefView-main\test\QCefViewTest
在此工程上修改使用重载 QCefView。
分两部分工作:
1、js前端框架jEasyUI开发的简单前端
2、js与qt通讯的粘合部分重载QCefView是否都能实现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/945507.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决Qt 不能debug问题

排查思路 1. 工程配置 通过deepseek查询得到编译选项需要+g,如下 CONFIG += debug QMAKE_CXXFLAGS += -g QMAKE_LFLAGS += -g 1.1. 排查系统的gdb文件是哪个,看是不是期望和和编译配置应用的编译器配套 ----如,都使…

2025年项目总延期?这30款项目进度管理软件让我提前交付率85%!

项目总延期是困扰团队效率的常见难题,但选对工具能让交付率提升至85%以上。本文将为您精选30款高效的项目进度管理软件,覆盖从敏捷开发到传统瀑布模型的不同需求。无论是禅道的全流程管控、Jira的敏捷适配性,还是Tr…

2025 年最新护眼灯生产厂家推荐榜:含全光谱智能照明标杆企业及高产能品牌优选指南自然光护眼/全光谱护眼/儿童护眼吸顶灯公司推荐

引言 当下,电子设备普及让人们日均用眼时长远超以往,护眼照明需求急剧攀升,但护眼灯市场乱象却让消费者陷入困境。众多产品仅靠 “护眼” 噱头吸引购买,实际在光谱连续性、防蓝光效果、频闪控制等核心指标上未达健…

Exadata数据库性能异常,备份进程卡住

1、案例概述 某客户有一台Exadata X9M-2,据客户反馈:“晚上20:30分,开始expdp备份,20:32分卡住。同时,在20:30分也发起了RMAN备份,RMAN备份在21:44也卡住。之后,杀掉进程,并重启恢复正常。” 现在,客户希望分…

做本地门户网站 10 年,我靠微擎摆脱了 “客户需求五花八门” 的噩梦

在我们这座三线城市,我经营的 “小城网” 算小有名气 —— 做了 10 年本地门户网站,从最初帮商家挂广告,到后来承接小程序、公众号开发,手里攒了 200 多个本地客户。可这两年,我却越来越怕接客户的电话,不是不想…

2025 年国内吸顶灯源头厂家最新推荐排行榜:聚焦全光谱技术与品质生产,精选优质厂家助力家居照明选购全光谱/中山现代/客厅现代/吊灯吸顶灯公司推荐

引言 当前家居照明市场中,吸顶灯因适配场景广、照明效果稳定成为众多家庭首选,但市场乱象却给消费者选购带来极大困扰。一方面,品牌数量繁杂且质量差距悬殊,部分小厂家使用劣质材料生产,导致产品存在寿命短、光效…

RabbitMQ框架及应用场景

简介 RabbitMQ是一个使用Erlang,基于AMQP协议的MQ组件。 AMQP全称为 Advanced Message Queuing Protocol(高级消息队列协议****),是一个面向消息的中间件传输协议,用于在应用程序之间进行异步消息通信。 AMQP协议…

UNIX下C语言编程与实践11-UNIX 动态库显式调用:dlopen、dlsym、dlerror、dlclose 函数的使用与实例 - 指南

UNIX下C语言编程与实践11-UNIX 动态库显式调用:dlopen、dlsym、dlerror、dlclose 函数的使用与实例 - 指南2025-10-24 16:56 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: …

熟知大模型中mcp概念 --by zk

MCP核心概念解析 什么是MCP:让大模型拥有“手和脚” 大模型本身只有对话和决策能力,没有执行调用工具,获取资源的能力。因此定义一套让大模型调用外部能力的通用协议很重要。MCP(Model Context Protocol)是一套让…

【开题答辩全过程】以 “辛巴克餐饮”小程序为例,具备答辩的问题和答案

【开题答辩全过程】以 “辛巴克餐饮”小程序为例,具备答辩的问题和答案pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: …

2025年一体化雨水提升泵站厂家权威推荐榜单:污水提升泵站/一体化污水泵站/一体化雨水泵站源头厂家精选

在市政排水与水资源管理领域,一体化雨水提升泵站已成为现代城市基础设施的核心组成部分,其高效性能直接关系到城市防洪排涝能力与水环境保护质量。 随着全球城市化进程加速,市政排水系统面临前所未有的压力。据最新…

STM32软件I2C读写AT24C64 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

bcc

bcc原理从内核中获取数据。 整个工具的核心原理是利用 eBPF 技术,在内核中与块设备 I/O 相关的关键函数上设置探针(Tracepoint),从而在几乎无开销的情况下捕获 I/O 请求的开始和结束时间,计算出延迟,并将结果存入…

手写ibatis

通用 Mapper:提供通用的 CRUD 方法。条件构造器:支持链式调用,构建查询条件。分页查询:支持 Oracle 的分页查询。连表查询:支持 JOIN 查询。指定字段查询:支持动态选择查询字段。注解支持:通过注解配置实体类和…

读书笔记:解锁数据库查询新姿势:函数索引让你的搜索又快又准

我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢! 由于博客中有大量代码,通过页面浏览效果更佳。本文为个人学…

国产IPD项目管理软件推荐|别再靠 Excel 推 IPD 了!帮你把IPD流程从“纸上”搬进系统

本文盘点了国内能真正支撑 IPD 流程落地的几款软件,从配置灵活、可视化程度高的飞书项目,到深度面向研发的禅道,覆盖制造业、硬件、互联网等多场景。看完你就能判断:哪一款最适合你的组织,帮你实现从立项到评审、…

【源码解读之 Mybatis】【核心篇】--第7篇:ParameterHandler参数处理机制

【源码解读之 Mybatis】【核心篇】--第7篇:ParameterHandler参数处理机制第7篇:ParameterHandler参数处理机制 1. 学习目标确认 1.0 第6篇思考题解答 在深入学习ParameterHandler参数处理机制之前,让我们先回顾并解…

[linux] 文件夹可写权限的关闭和打开

设置仅可读:chmod -R a-w <folder_path>打开写权限:chmod -R 766 <folder_path>

2025年教室护眼灯厂家权威推荐榜单:led教室灯/幼儿园教室灯/教室照明灯具源头厂家精选

随着社会对青少年视觉健康的日益关注,教室照明环境已成为学校建设的重点环节。专业的教室护眼灯不仅能有效降低学生近视发生率,还能提升学习效率。本文将基于行业调研与公开数据,对当前市场上具有代表性的教室护眼灯…

2025年自动定量灌装机厂家权威推荐榜单:称重灌装机/膏状灌装机/瓶灌装机源头厂家精选

在当今工业化进程中,自动定量灌装设备作为生产线核心环节,其技术水平直接影响企业生产效益与产品质量。随着智能制造的深入推进,灌装设备行业正经历着从机械化向数字化、智能化的重要转型。本文将基于行业数据与技术…