Qt 集成miniblink浏览器库之2封装

qt中使用miniblink总结 由于项目需要,一直使用qt5.7.0这个版本,但是这个版本携带的webwidget不支持vue等项目的运行,可能chrom内核版本太旧 于是就查找了一下开源项目,发现了miniblink这个东西,引用也非常方面,今天使用了一下,现在做一个总结 github上下载sdk,解压出来里面有两个文件有用 把wke.h复制到工程目录下,把node.dll复制到运行目录下 ,接下来新建一个qt的gui项目,main函数中这样写 int main(int argc, char *argv[]) { QA 阅读详情

前面一节已经介绍了如何编译miniblink库以及如何在qt下使用,但是创立的是个独立窗体,应用中我们经常用到的是作为一个子窗体嵌入到其他窗体之中,类似QWebengnieView,本节将实现这个功能。

首先参考前一节将需要的库文件,头文件引入工程。

1.创建一个类QMiniblinkWebView继承自QWidget

2.初始化initialize接口

由于miniblink使用需要先初始化,这里设计在构造函数中处理这个问题,多个QMiniblinkWebView只需要初始化一次,所以这里定义两个静态变量

static bool _isInit;

static int _viewCount;

_isInit 用户判断是否初始化,_viewCount用户判断当前有多少个QMiniblinkWebView实例, 每次创建实力自动加一,当_viewCount为0时自动释放miniblink。为了方式 拷贝构造和复制私有化这两个函数

private:
    QMiniblinkWebView & operator == (const QMiniblinkWebView&){}
    QMiniblinkWebView(const QMiniblinkWebView&){}

初始化函数实现如下:

void QMiniblinkWebView::initialize()
{
    QString nodePath = QApplication::applicationDirPath() + "/node.dll";
    if(!QFile::exists(nodePath))
    {
        qDebug()<<QStringLiteral("请将node.dll拷贝到运行目录");
        return;
    }
    std::vector<wchar_t> tempPath;
    tempPath.resize(MAX_PATH);
    nodePath.toWCharArray(&tempPath[0]);
    wkeSetWkeDllPath(&tempPath[0]);

    wkeInitialize();
    _isInit = true;
    ++QMiniblinkWebView::_viewCount;
}

3. 释放接口

当前实力为0时 释放miniblink

void QMiniblinkWebView::finalize()
{
    if(--QMiniblinkWebView::_viewCount == 0)
    {
        wkeFinalize();
        _isInit = false;
    }
}

4.创建miniblinkview

调用wkeCreateWebWindow(WKE_WINDOW_TYPE_TRANSPARENT, (HWND)this->winId(), 0, 0, width(), height()); 进行创建,此处创建的是一个window

5.将步骤4创建的view子类化为QtWidget子窗体

通过wkeGetWindowHandle(viewer)可以拿到wkeCreateWebWindow创建的viewer的窗口句柄,然后调用windows函数SetParent建立父子关系

SetParent(wkeGetWindowHandle(viewer), (HWND)this->winId());

6.大小改变

4,5创建的窗体是固定大小,当我们改变QWidget大小时,wkeCreateWebWindow创建的viewer大小并不会随之改变,我们需要截获QWidget大小改变通知。你可能会想到继承QWidget::resizeEvent,经我实践,wkeCreateWebWindow创建的窗口影响了这个事件

获取的大小不正确。所以这里依旧使用windows窗口回调来实现。

调用SetWindowSubclass为qt窗体设置一个回调函数 SetWindowSubclass((HWND)this->winId(), subClassProc, 0, (DWORD_PTR)this);

回调函数的实现如下,这是一个静态成员函数,也可以写成一个全局函数。

LRESULT CALLBACK QMiniblinkWebView::subClassProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData)
{
    QMiniblinkWebView *obj = (QMiniblinkWebView *)dwRefData;
    if(obj == nullptr)
        return DefSubclassProc(hWnd, uMsg, wParam, lParam);
    switch (uMsg) {
    case WM_SIZE:
         obj->autojustWebViewSize();
        break;
    default:
        break;
    }
    return DefSubclassProc(hWnd, uMsg, wParam, lParam);
}

 

这里只做了一件事,就是调用接口autojustWebViewSize实现viewer跟谁qt父窗口大小改变。

void QMiniblinkWebView::autojustWebViewSize()
{
    //此处如果用qt得方法获取大小在最大化最小化有问题,故改为通过windows函数获取,可能是qt版本问题
    //wkeMoveWindow(_viewer, 0, 0, width(), height());
    RECT rect;
    GetWindowRect((HWND)this->winId(), &rect);
    wkeMoveWindow(_viewer, 0, 0, rect.right - rect.left, rect.bottom - rect.top);

}

此处如果用qt得方法获取大小在最大化最小化有问题,故改为通过windows函数获取,可能是qt版本问题。

自此我们就基本完成了miniblink集成到qt了,可以将QMiniblinkWebView作为独立窗口使用,也可以作为任意一个qt窗口的子窗体使用。

7.事件通知

miniblink的通知是回调机制,wke.h 包含了所有的函数定义以及回调的函数指针定义,我们需要获取到什么通知就定义个相应函数指针类型的回调函数就可以活得通知,我这里实现了常用的几个通知,然后转化为qt信号的方式发出去。

    wkeWebView viewer = wkeCreateWebWindow(WKE_WINDOW_TYPE_TRANSPARENT, (HWND)this->winId(), 0, 0, width(), height());
    if (!viewer)
        return nullptr;
    wkeSetWindowTitleW(viewer, title.toStdWString().c_str());
    wkeOnDocumentReady(viewer, handleDocumentReady, nullptr);
    wkeOnLoadUrlBegin(viewer, onLoadUrlBegin, (void *)this);
    wkeOnLoadUrlEnd(viewer, onLoadUrlEnd, (void *)this);
    wkeOnLoadUrlFail(viewer, onLoadUrlFailed, (void *)this);
    wkeOnLoadingFinish(viewer, onLoadingFinish, (void *)this);
    //wkeMoveToCenter(viewer);
    SetWindowSubclass((HWND)this->winId(), subClassProc, 0, (DWORD_PTR)this);
    SetParent(wkeGetWindowHandle(viewer), (HWND)this->winId());
    wkeMoveWindow(viewer, 0, 0, width(), height());
 

//文档加载完成

    static void handleDocumentReady(wkeWebView webWindow, void* param);

//开始加载
    static bool onLoadUrlBegin(wkeWebView webView, void* param, const char* url, void *job);

//加载完,并不一定是成功的
    static void onLoadUrlEnd(wkeWebView webView, void* param, const char *url, void *job, void* buf, int len);

//加载失败
    static void onLoadUrlFailed(wkeWebView webView, void* param, const utf8* url, wkeNetJob job);

//加载完成,failedReason包含了失败的原因
    static void onLoadingFinish(wkeWebView webView, void* param, const wkeString url, wkeLoadingResult result, const wkeString failedReason);

由于都是回调函数,需要定义成静态成员函数或者全局函数,函数的参数可以直接看wke.h。需要其他回调的可以参考wke.h自己添加比如下载的进度等等。

bool QMiniblinkWebView::onLoadUrlBegin(wkeWebView webView, void* param, const char* url, void *job)
{
    QMiniblinkWebView *obj = (QMiniblinkWebView *)param;
    if(obj != nullptr)
    {
        emit obj->loadStarted();
    }
    return true;
}

void QMiniblinkWebView::onLoadUrlEnd(wkeWebView webView, void* param, const char *url, void *job, void* buf, int len)
{
    QMiniblinkWebView *obj = (QMiniblinkWebView *)param;
    if(obj != nullptr)
    {
        emit obj->loadFinished(true);
    }
}

void QMiniblinkWebView::onLoadUrlFailed(wkeWebView webView, void* param, const utf8* url, wkeNetJob job)
{
    QMiniblinkWebView *obj = (QMiniblinkWebView *)param;
    if(obj != nullptr)
    {
        emit obj->loadUrlFail();
    }
}

void  QMiniblinkWebView::onLoadingFinish(wkeWebView webView, void* param, const wkeString url, wkeLoadingResult result, const wkeString failedReason)
{
    QMiniblinkWebView *obj = (QMiniblinkWebView *)param;
    if(obj != nullptr && result == WKE_LOADING_SUCCEEDED)
    {
        emit obj->loadFinished(true);
    }
}

自此,一个简单的qt版miniblink封装已经完成

8.使用

1.独立窗口

    QMiniblinkWebView w2;
    w2.show();
    //w2.loadFile("./debug/2.html");
    w2.load("http://baidu.com");

2.子窗体

    QMiniblinkWebView *w2 = new QMiniblinkWebView("http://baidu.com", this);
    setCentralWidget(w2);

代码都很简单,主要步骤为5.将步骤4创建的view子类化为QtWidget子窗体,如果需要完整源码,可以留言。

下一节将介绍如何实现js与C++得通信

Qt使用miniblink第三方浏览器模块 Qt编写地图综合应用58-兼容多浏览器内核用Qt做项目过程中,遇到需要用到浏览器控件的项目,可能都会绕不开一个问题,那就是从Qt5.6版本开始mingw编译器的Qt构建套件,不再提供浏览器控件了,之前还可以用webkit。 阅读详情

相关推荐

关于Qt嵌入浏览器(一)

最后总结,echarts里面还有很多很好看的图,不只是图表,还有地图,后面会写怎么嵌入地图,但是minblink也有一个弊端,就是它只能嵌入一个浏览器界面,多个好像就不行了,不能通信,目前还没有解决,但是还有另外一个方法就是,在linux系统下运行,它就只有一个编译器,就可以不用miniblink库,直接用它自带的QWebEngineView,可以嵌入多个浏览器界面进行通信,后面如果有时间会出详细教程。具体可以参考我前面提到的文章,它有一个封装的miniblink库,可以直接用,按照它的工程结构图。

cc00q的博客 1614

Qt 集成miniblink浏览器库之1编译使用

1.miniblink简介 miniblink是一款精简小巧的浏览器控件,由龙泉寺扫地僧基于chromium精简而成,是市面上最小巧的chromium内核控件没有之一。 它仅10余M大小,只需一个dll,几个纯C接口即可轻松调起,并嵌入到任何软件内使用。 你可以用来显示网页、做软件的界面框架、做爬虫等功能。 它内置了各种网络拦截接口,可以方便的替换网络资源;解除了跨域访问限制,方便本地开发测试等。 如果你使用过cef、wke的话,相信很容易理解。 miniblink采用的接口和wke几乎一模一.

xpg4321的博客 2639

基于Qt封装miniblink库-支持mingw和vc

基于Qt封装的miniblink版本的浏览器,支持mingw和vc编译器,仅仅支持windows平台

QT使用miniblink内嵌html网页并调用其js方法

可以实现cpp代码调用js方法的效果

m0_63257050的博客 2218

miniblink c++ qt 浏览器

qt基于miniblink实现浏览器功能,有C++和JS交互功能,miniblink 是基于chromium内核进行裁剪的轻量级的浏览器开发框架,纯C实现,使用简单,只需要一个dll和头文件即可。

MiniBlink扫地僧20210831编译二进制包

MiniBlink扫地僧20210831编译二进制包

Qt 集成miniblink浏览器库之4 解决兼容性问题

之前介绍了如何miniblink集成到qt,采用wkeCreateWebWindow来创建一个浏览器窗口,wkeCreateWebWindow有三种方式 typedef enum _wkeWindowType { WKE_WINDOW_TYPE_POPUP, WKE_WINDOW_TYPE_TRANSPARENT, WKE_WINDOW_TYPE_CONTROL } wkeWindowType; WKE_WINDOW_TYPE_POPUP 创建一个弹出式窗体,模态窗体。 W...

xpg4321的博客 1930

Gitlab+Jenkins+Docker+Harbor+K8s+Rancher集群搭建CICD平台

本文以诺依项目为例详细记录了Kubernetes集群的部署过程以及配套DevOps环境的搭建。主要内容包括:1) 配置8个节点的软硬件环境;2) 基础环境准备(网络、防火墙、Docker等);3) 三节点Kubernetes集群部署;4) GitLab代码仓库安装;5) Harbor私有镜像仓库搭建;6) Jenkins持续集成工具配置;7) 基于若依项目的CI/CD实践;8) Rancher集群管理工具部署。

hickman2023的博客 1201

Qt 集成miniblink浏览器库之3 C++ js相互调用

上一节已经将miniblink集成到qt,实现了浏览器得基本调用接口,这一节介绍如何实现通信。 1.C++调用js miniblink接口wkeRunJSW可以实现C++调用js 例如我们在js中写一个绑定到window的函数openDialog 就可以这样调用 wkeRunJSW("window.openDialog()"); 这跟cef,QtWebEngine完全一样 2.js调用C++ 首先我们写一个测试的html如下: <html> <head> ..

xpg4321的博客 1893

量化风控核心:信用评分卡模型的设计与迭代全流程

◦ 动态策略适配:根据评分卡结果动态调整风控流程——高分用户(>750分)秒级放款,中低分用户(600-700分)触发补充资料提交,低分用户(<600分)直接拒绝。◦ 特征有效性监控:每月计算特征IV值,对IV<0.1的低效特征(如“用户星座”)进行淘汰,同时引入新特征(如电商消费数据)。某城商行通过增量学习,评分卡PSI值长期稳定在0.1以下。◦ 数据筛选:整合征信数据(逾期记录、查询次数)、行为数据(消费频次、还款习惯),某银行评分卡纳入150+维度特征,覆盖用户偿债能力、意愿、稳定性等维度;

2501_91651383的博客 1483

紫光同创PDS软件操作指南:如何为FPGA新增自定义Flash型号

本文详细介绍了在紫光同创PDS软件中为FPGA新增自定义Flash型号的完整操作指南。针对官方支持列表之外的SPI Flash芯片,文章从理解FPGA配置逻辑入手,逐步讲解如何通过扫描Flash ID、在Flash Operator中精准填写参数、转换.sbit文件,最终完成固化的全过程,并分享了高级技巧与常见问题排查方法,帮助工程师摆脱对预设型号的依赖,实现灵活选型。

weixin_29204749的博客 325

基于Qt封装miniblink库-支持mingw和vc:轻松集成网页渲染能力

基于Qt封装miniblink库-支持mingw和vc:轻松集成网页渲染能力 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在现代软件开发中,集成网页渲染引擎已经成为许多应用程序的必备功能。今天,我要为您介绍的是一个基于Qt封装的miniblink库版本,它支持mingw和vc编译器,并专注于Windows平台。这个项目可以帮助开发者轻松地将miniblink浏览器内...

gitblog_06787的博客 429

科研生产力革命:手把手教你打造基于大模型的Research Agent(文献调研+论文写作+思路激发)

本文介绍了如何利用Research Agent(科研智能体)提升科研效率。Research Agent能自主完成文献检索、信息整合和报告生成全流程,省去50%以上的基础工作时间。文章详细讲解了搭建运行环境的方法,包括工具准备和MetaGPT配置,并提供了两种实战方案:基础版Search-O1和专业版MetaGPT Research Agent。此外,还介绍了如何为垂直领域定制Agent,以及优化检索效果、改善报告逻辑等技巧。最后列举了学术研究、行业分析、内容创作和个人学习四大应用场景,帮助用户将AI从聊天工

LXY_LOVE36的博客 266

Qt/C++编写地图综合应用24-miniblink内核

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

Qt/C++视频监控/推流/物联网/大屏系统/自定义控件/UI定制/输入法 3022

Python 爬虫实战:抓取百科网站上某个词条的详细信息

百科网站(如维基百科)为用户提供了丰富的知识内容,涵盖了从历史、文化到科技等几乎所有领域的知识。对于需要大量数据进行分析、研究或机器学习项目的开发者而言,抓取这些网站的数据显得尤为重要。通过编写一个 Python 爬虫,我们能够轻松地抓取百科网站上的某个词条及其详细信息,从而获取并整理这些知识内容。本篇博客将深入介绍如何通过 Python 编写爬虫来抓取百科网站(如维基百科)的某个词条的详细信息,包括标题、正文内容、参考文献等。requests:发送 HTTP 请求,获取页面内容。

2201_76125261的博客 1669

PPT制作能力在职场中真的重要吗?一定要美术功底才能学好PPT吗?

我推出PPT技能培训专栏啦!好的PPT可以让你事半功倍、2023拥有PPT能力还可以让你具备一门极有价值的斜杠能力。更多内容请进:梦幻训练营专栏。专栏内会用本人积累的近10年的PPT学习方法论在短时间内教会你如何制作出精美绝伦的PPT,每篇教程后还会免费赠送一些小福利,不可多得。

打造全国最全的AI Agent开发知识领域的博客 728

qt 图片浏览器_Qt编写地图综合应用24-miniblink内核

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

weixin_29185199的博客 299

【25届数字IC秋招总结】面试经验15——比特大陆-算能

25届数字ic面试记录——比特大陆-算能

lalala0635的博客 554

BrowserSkill与Playwright MCP对比评测:真实浏览器+Agent Window胜在哪里?

BrowserSkill 与 Playwright MCP 都是让 AI Agent 操作浏览器的自动化工具,但路线截然不同:前者驱动你**真实登录状态**的浏览器,让 Agent 在独立的 Agent Window 中工作而不打断你的操作;后者主要驱动自己启动的浏览器实例。本文从登录状态、窗口隔离、人机协作三个维度做对比评测,帮你快速选对工具。 [![BrowserSkill 浏览器自动化横幅

gitblog_00194的博客 984

后仿真中的必懂VCS仿真选项之initreg和deposit

后仿真中,我们常常对于没有复位寄存器和存储器单元,使用仿真选项之initreg和deposit,两种处理方式。今天做总结。请注意:请勿将两者进行同时使用。对于到底选取哪种方式,要结合实际的情况决断。但是,两者同时使用,会有冲突,得不到预期结果。

那么菜的博客 4331

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C++ miniblink mb开源浏览器框架

桌面浏览器开发,之前一直用的是qt自带的webkit模板,存在一些刷新问题,升级后mingw版本不在支持webkits,只得寻求三方控件。 miniblink 是一款基于chromium内核开源的浏览器框架,进行了大量的裁剪,体积非常小且封装的很简练,只需要一个node.dll和wke.h就可以进行使用了,作者:龙泉寺扫地僧,并且还在不断的完善,感谢无私分享的好人。 先去github上下载源码...

独自跳舞 2409

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

libcef、QWebKit,QWebengine、miniblink内嵌浏览器对比

随着前端技术的发展,PC端程序越来越倾向于做第三方嵌入浏览器的应用程序; 如:腾讯视频、虾米音乐等主流PC端程序都是内嵌浏览器,对频繁更新的内容使用加载网页的方式;现对主流易集成的开源浏览器进行分析; 1、libcef 优点:功能齐全,跨平台; 缺点:安装包大(80M+),内容太多; 实际使用:对开发者技术要求高; 2、QWebKit:Qt5.6及之前使用 优点:接口友好,易...

二丶九 6738

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Qt 集成miniblink浏览器库之5 支持独立窗口和子窗口

前面使用GDI绘制解决了集成到Qt的系统冲突和QWebEngineView的冲突,但仅支持作为qt的子窗体,现在将其修改为支持独立窗口的创建。 首先判断create接口传入的父窗口句柄是否是空,为空表示创建一个独立窗口,代码如下: _hWnd = CreateWindow(wkeWebViewClassName, 0, WS_CAPTION | WS_VISIBLE | WS_BORDER | WS_MINIMIZEBOX |...

xpg4321的博客 1473
上一篇: Qt 集成miniblink浏览器库之1编译使用
下一篇: Qt 集成miniblink浏览器库之3 C++ js相互调用
很菜但努力
博客等级 码龄17年 113粉丝 50原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值