Qt使用miniblink第三方浏览器模块

文章目录

  • 一、前言
  • 二、miniblink简介
  • 三、miniblink使用
  • 四、运行效果
  • 五、工程结构

一、前言

本文取自刘典武大师:Qt编写地图综合应用58-兼容多浏览器内核

用Qt做项目过程中,遇到需要用到浏览器控件的项目,可能都会绕不开一个问题,那就是从Qt5.6版本开始mingw编译器的Qt构建套件,不再提供浏览器控件了,之前还可以用webkit控件,这下很多项目要么选择5.6以下版本,要么选择msvc的构建套件,而且大部分的msvc构建套件还不自带浏览器控件,也需要自己编译,只有原配的构建套件比如Qt5.9+VS2015、Qt5.12+VS2017这种搭配才可能有浏览器控件,不然就算你勾选了浏览器控件也不会安装,这样就使得很多依赖浏览器控件的项目比较被动。

于是必须寻找一个轻量级的浏览器控件来替代,比如cefminiblink,个人更倾向于miniblink,用法极其简单,依赖极其精简就一个dll,在linuxmac系统上本来qt就一直会有浏览器控件,所以也就不涉及到跨平台的问题,所以miniblink暂支持windows的缺点也就不算缺点了。


二、miniblink简介

屌炸天的内核来袭,史上最小chromium内核miniblink!

miniblink github

miniblink是一个追求极致小巧的浏览器内核项目,全世界第三大流行的浏览器内核控件。其基于chromium最新版内核,去除了chromium所有多余的部件,只保留最基本的排版引擎blinkminiblink保持了10M左右的极简大小,是所有同类产品最小的体积,同时支持windows xpnpapi

qt+miniblink用法步骤

  • 第一步:调用wkeSetWkeDllPath函数加载dll文件路径,一个项目只需要执行一次。
  • 第二步:调用wkeInitialize初始化动态库,一个项目只需要执行一次。
  • 第三步:调用wkeCreateWebWindow创建一个浏览器控件,传入句柄。
  • 第四步:调用wkeOnLoadingFinish注册回调加载完成信号,有需要才注册。
  • 第五步:调用wkeJsBindFunction注册回调接收数据的方法,一定要放在这里在网页加载前执行。
  • 第六步:调用wkeLoadURL加载网址、wkeLoadFile加载网页文件、wkeLoadHtmlWithBaseUrl加载网页内容。
  • 第七步:调用wkeRunJS执行js函数,超级简单。
  • 第八步:调用wkeFinalize释放资源,只要执行一次,在整个项目结束的时候。

三、miniblink使用

使用miniblink需要三个文件:wke.hminiblink.dllminiblink_64.dll

刘典武大师封装了一个miniblink浏览器类

#ifndef MINIBLINK_H
#define MINIBLINK_H#include <QWidget>
#include "wke.h"class miniblink : public QWidget
{Q_OBJECT
public:explicit miniblink(QWidget *parent = 0);//初始化资源static void init();//释放资源static void release();protected://设置浏览器控件自动适应大小void resizeEvent(QResizeEvent *);private://浏览器控件对象wkeWebView webView;signals://网页载入完成void loadFinished(bool ok);//收到网页发出来的数据void receiveDataFromJs(const QString &type, const QVariant &data);public://给回调用的函数void loadFinish(bool ok);void receiveData(const QString &type, const QVariant &data);public slots://加载网址或者本地文件void load(const QString &url, bool file = false);//加载html内容void setHtml(const QString &html, const QString &baseUrl);//执行js函数void runJs(const QString &js);
};#endif // MINIBLINK_H
#pragma execution_character_set("utf-8")
#include "miniblink.h"
#include "qapplication.h"
#include "qmessagebox.h"
#include "qdatetime.h"
#include "qfile.h"
#include "qvariant.h"
#include "qdebug.h"#define TIMEMS QTime::currentTime().toString("hh:mm:ss zzz")
void onLoadingFinish(wkeWebView, void *param, const wkeString, wkeLoadingResult result, const wkeString)
{//qDebug() << "onLoadingFinish" << result;//在注册函数的地方就已经传入了类指针miniblink *widget = (miniblink *)param;//0 = WKE_LOADING_SUCCEEDED, 1 = WKE_LOADING_FAILED, 2 = WKE_LOADING_CANCELEDwidget->loadFinish(result == 0);
}jsValue WKE_CALL_TYPE objName_receiveData(jsExecState es, void *param)
{if (0 == jsArgCount(es)) {return jsUndefined();}//挨个取出参数,设定的通用方法,只有两个参数jsValue arg0 = jsArg(es, 0);jsValue arg1 = jsArg(es, 1);if (!jsIsString(arg0)) {return jsUndefined();}//在注册函数的地方就已经传入了类指针miniblink *widget = (miniblink *)param;QString type = QString::fromStdString(jsToString(es, arg0));QVariant data = QString::fromStdString(jsToString(es, arg1));widget->receiveData(type, data);return jsUndefined();
}miniblink::miniblink(QWidget *parent) : QWidget(parent)
{//第一步先初始化动态库init();//第二步初始化浏览器控件//创建一个浏览器控件,放入句柄webView = wkeCreateWebWindow(WKE_WINDOW_TYPE_CONTROL, (HWND)this->winId(), 0, 0, this->width(), this->height());//关联完成信号wkeOnLoadingFinish(webView, onLoadingFinish, this);//设置浏览器控件可见wkeShowWindow(webView, TRUE);//注册通用的接收数据的方法,一定要放在这里在网页加载前执行wkeJsBindFunction("objName_receiveData", objName_receiveData, this, 2);
}void miniblink::init()
{//全局只需要初始化一次static bool isInit = false;if (!isInit) {isInit = true;//不同的构建套件位数加载不同的动态库
#ifdef Q_OS_WIN64QString flag = "64";QString file = qApp->applicationDirPath() + "/miniblink_64.dll";
#elseQString flag = "32";QString file = qApp->applicationDirPath() + "/miniblink.dll";
#endif//如果文件不存在则提示if (!QFile(file).exists()) {QMessageBox::critical(0, "错误", file + "\n文件不存在请先拷贝!");return;}const wchar_t *path = reinterpret_cast<const wchar_t *>(file.utf16());wkeSetWkeDllPath(path);bool ok = wkeInitialize();qDebug() << TIMEMS << QString("init miniblink_%1 %2").arg(flag).arg(ok ? "ok" : "error");}
}void miniblink::release()
{wkeFinalize();
}void miniblink::resizeEvent(QResizeEvent *)
{wkeResize(webView, this->width(), this->height());
}void miniblink::loadFinish(bool ok)
{emit loadFinished(ok);
}void miniblink::receiveData(const QString &type, const QVariant &data)
{emit receiveDataFromJs(type, data);
}void miniblink::load(const QString &url, bool file)
{QByteArray data = url.toUtf8();const char *temp = data.data();if (file) {wkeLoadFile(webView, temp);} else {wkeLoadURL(webView, temp);}
}void miniblink::setHtml(const QString &html, const QString &baseUrl)
{QByteArray dataHtml = html.toUtf8();QByteArray dataUrl = baseUrl.toUtf8();wkeLoadHtmlWithBaseUrl(webView, dataHtml.data(), dataUrl.data());
}void miniblink::runJs(const QString &js)
{QByteArray data = js.toUtf8();wkeRunJS(webView, data.data());
}

有了这个浏览器类之后,就可以正常的调用接口了

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include "miniblink.h"namespace Ui {
class Widget;
}class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();private:Ui::Widget *ui;miniblink *webView;private slots:void initForm();//网页载入完成void loadFinished(bool ok);//收到网页发出来的数据void receiveDataFromJs(const QString &type, const QVariant &data);private slots:void on_btnLoadUrl_clicked();void on_btnLoadFile_clicked();void on_btnLoadHtml_clicked();void on_btnRunJs_clicked();void on_horizontalSlider_valueChanged(int value);
};#endif // WIDGET_H
#include "widget.h"
#include "ui_widget.h"
#include "qapplication.h"
#include "qdebug.h"Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);this->initForm();on_btnLoadFile_clicked();
}Widget::~Widget()
{delete ui;
}void Widget::initForm()
{webView = new miniblink;connect(webView, SIGNAL(loadFinished(bool)), this, SLOT(loadFinished(bool)));connect(webView, SIGNAL(receiveDataFromJs(QString, QVariant)),this, SLOT(receiveDataFromJs(QString, QVariant)));ui->gridLayout->addWidget(webView, 0, 0);
}void Widget::loadFinished(bool ok)
{qDebug() << "加载完成" << ok;
}void Widget::receiveDataFromJs(const QString &type, const QVariant &data)
{qDebug() << "收到数据" << type << data;
}void Widget::on_btnLoadUrl_clicked()
{webView->load("https://www.baidu.com");
}void Widget::on_btnLoadFile_clicked()
{webView->load(qApp->applicationDirPath() + "/demo.html", true);
}void Widget::on_btnLoadHtml_clicked()
{QStringList html;html << "<html><body>";html << "<h2>Hello World</h2>";html << "</body></html>";webView->setHtml(html.join(""), "");
}void Widget::on_btnRunJs_clicked()
{webView->load(qApp->applicationDirPath() + "/gauge.html", true);
}void Widget::on_horizontalSlider_valueChanged(int value)
{QString js = QString("setGaugeValue(%1)").arg(value);webView->runJs(js);
}

四、运行效果

需要把miniblink.dllminiblink_64.dll 放到可执行文件目录下,才能运行起来

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


五、工程结构

在这里插入图片描述

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

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

相关文章

【Web】VS Code 插件

专栏文章索引&#xff1a;Web 有问题可私聊&#xff1a;QQ&#xff1a;3375119339 目录 一、安装步骤 二、插件 1.Chinese (Simplified) (简体中文) 2.open in browser 3.vscode-icons 4.Live Server 5.Live Server Preview 6.翻译(英汉词典) 一、安装步骤 点击 “扩…

创纪录的里程碑!光镊阵列捕获逾6,000中性原子,量子计算再达新高

论文链接&#xff1a; https://arxiv.org/abs/2403.12021 2024年3月18日&#xff0c;研究人员成功开发出一种大规模光镊阵列&#xff0c;能够在12,000个位点上捕获超过6,100个中性原子&#xff0c;同时在几个关键性能指标上达到新的高度&#xff1a; 1&#xff09;相干时间达到…

新零售门店、商品、会员管理指标体系总览

新零售&#xff0c;旨在打破传统零售业的边界&#xff0c;引入先进科技和数字化手段&#xff0c;通过整合线上线下渠道&#xff0c;全面提升用户体验&#xff0c;并实现更智能、高效、个性化的零售运营模式。这一模式不仅仅关注销售产品&#xff0c;更注重构建全方位的购物生态…

《中医临床诊疗术语》数据库

最新版的《中医临床诊疗术语》于2023年3月17日由国家中医药管理局提出的&#xff0c;由国家市场监督管理总局和国家标准化管理委员会共同发布。新版的修订是为落实相关政策文件要求&#xff0c;推进中医医疗服务规范化、标准化管理&#xff0c;提高中医医疗服务标准化水平和管理…

asyncio异步编程

参考视频&#xff1a;02 协程_哔哩哔哩_bilibili 1.协程&#xff1a;&#xff08;不是计算机中真实存在的&#xff0c;人为创造出的概念&#xff09;&#xff0c;也可称为微线程。 本质是用一个线程在一段代码中来会切换游走的线程&#xff0c;是一种用户态内的上下文切换技术…

中科驭数:DPU是构建高效智算中心基础设施的必选项

4 月 15 日&#xff0c;在江苏省未来网络创新研究院、网络通信与安全紫金山实验室举办的“2024智算网络技术与应用创新峰会”上&#xff0c;中科驭数作为DPU算力基础设施领军企业&#xff0c;受邀出席本次峰会。中科驭数产品运营部副总经理曹辉先生在《基于DPU的高效智算中心算…

OpenCV与AI深度学习 | 2024年AI初学者需要掌握的热门技能有哪些?

本文来源公众号“OpenCV与AI深度学习”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;2024年AI初学者需要掌握的热门技能有哪些&#xff1f; 0 导 读 本文主要介绍2024年AI初学者需要掌握的热门技能。 1 前 言 人工智能无疑是技…

基于java+springboot+vue实现的智慧党建系统(文末源码+Lw+ppt)23-58

摘 要 当今社会进入了科技进步、经济社会快速发展的新时代。国际信息和学术交流也不断加强&#xff0c;计算机技术对经济社会发展和人民生活改善的影响也日益突出&#xff0c;人类的生存和思考方式也产生了变化。传统智慧党建管理采取了人工的管理方法&#xff0c;但这种管…

openGauss学习笔记-264 openGauss性能调优-TPCC性能调优测试指导-BIOS配置

文章目录 openGauss学习笔记-264 openGauss性能调优-TPCC性能调优测试指导-BIOS配置264.1 恢复BIOS出厂设置264.2 修改相关BIOS设置264.3 重启操作系统 openGauss学习笔记-264 openGauss性能调优-TPCC性能调优测试指导-BIOS配置 本章节主要介绍openGauss数据库内核基于鲲鹏服务…

BTI功能验证与异常解析

BTI分支目标识别精讲与实践系列 思考 1、什么是代码重用攻击&#xff1f;什么是ROP攻击&#xff1f;区别与联系&#xff1f; 2、什么是JOP攻击&#xff1f;间接分支跳转指令&#xff1f; 3、JOP攻击的缓解技术&#xff1f;控制流完整性保护&#xff1f; 4、BTI下的JOP如何…

【MATLAB源码-第53期】m代码基于粒子群算法(PSO)的三维路径规划,显示最优路径和适应度曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 粒子群算法&#xff08;Particle Swarm Optimization&#xff0c;简称PSO&#xff09;是一种模拟鸟群觅食行为的启发式优化方法。以下是其详细描述&#xff1a; 基本思想&#xff1a; 鸟群在寻找食物时&#xff0c;每只鸟都…

【开发篇】十三、JVM基础参数设置与垃圾回收器的选择

文章目录 1、-Xmx 和 –Xms2、-XX:MaxMetaspaceSize 和 –XX:MetaspaceSize3、-Xss4、不建议改的参数5、其他参数6、选择GC回收器的调试思路7、CMS的并发模式失败现象的解决8、调优案例 GC问题解决方式&#xff1a; 优化JVM基础参数&#xff0c;避免频繁Full GC减少对象的产生…

ADB的基本语法及常用命令

学习网址 ADB命令的基本语法如下&#xff1a; adb [-d|-e|-s <serialNumber>] <command> 如果有多个设备/模拟器连接&#xff0c;则需要为命令指定目标设备。 参数及含义如下&#xff1a; 常用命令如下&#xff1a; 1. 启动ADB服务 adb start-server 2. 停止…

JavaScript入门--数组

JavaScript入门--数组 前言数组的操作1、在数组的尾部添加元素2、删除数组尾部的元素&#xff0c;也就是最后一个元素3、删除头部第一个元素4、在数组的前面添加元素 小案例5、数组的翻转6、数组的排序7、数组的合并8、数组的切片 前言 JS中的数组类似于python中的列表&#x…

人工智能揭示矩阵乘法的新可能性

人工智能揭示矩阵乘法的新可能性 数学家酷爱漂亮的谜题。当你尝试找到最有效的方法时&#xff0c;即使像乘法矩阵&#xff08;二维数字表&#xff09;这样抽象的东西也会感觉像玩一场游戏。这有点像尝试用尽可能少的步骤解开魔方——具有挑战性&#xff0c;但也很诱人。除了魔方…

政安晨:【深度学习神经网络基础】(九)—— 在深度学习神经网络反向传播训练中理解梯度

目录 简述 理解梯度 什么是梯度 计算梯度 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: 政安晨的机器学习笔记 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 简述 在深度…

SQL SERVER的安装

目录 1.百度SQL SERVER找到图下的所显示的&#xff0c;点击进去 2.找到图下红色框起来的&#xff0c;点击立即下载​ 3.下载好之后点开&#xff0c;选择下载介质 4.SQLSERVER下载成功之后选择打开文件夹​ 6.双击后缀名是.iso的镜像文件 7.双击setup.exe进行安装​ 8.安…

BTI性能开销权衡及优化措施

BTI分支目标识别精讲与实践系列 思考 1、什么是代码重用攻击&#xff1f;什么是ROP攻击&#xff1f;区别与联系&#xff1f; 2、什么是JOP攻击&#xff1f;间接分支跳转指令&#xff1f; 3、JOP攻击的缓解技术&#xff1f;控制流完整性保护&#xff1f; 4、BTI下的JOP如何…

vue:如何通过两个点的经纬度进行距离的计算(很简单)

首先假设从api获取到了自己的纬经度和别人的纬经度 首先有一个概念需要说一下 地球半径 由于地球不是一个完美的球体&#xff0c;所以并不能用一个特别准确的值来表示地球的实际半径&#xff0c;不过由于地球的形状很接近球体&#xff0c;用[6357km] 到 [6378km]的范围值可以…

免费HTTPS证书获取攻略

申请SSL证书可简化为以下三个步骤&#xff1a; 第一步&#xff1a;选择证书类型与提供商 - 确定网站需求&#xff0c;选择合适的SSL证书类型&#xff08;如DV、OV、EV&#xff09;。 - 选取信誉良好的证书颁发机构&#xff08;CA&#xff09;。 永久免费SSL证书_永久免费htt…