QWebEngine应用---基于QWebChannel实现网页与qt层交互

news2024/11/16 11:50:48

Qt提供了QWebChannel实现和网页的通信,我们直接拿github上一个能直接运行的demo来做说明,demo是基于Widget,且页面是自己实现的页面,接着会介绍基于QML实现且页面是第三方网站如何使用的。

QWebChannel用法

我们先看看demo的运行效果

 左边是widget界面,右边是QWebEngineView,两边支持互发消息。

大体原理是定义一个通信类,这个类为Document,通过这个类发送和接收消息,QWebChannel绑定这个类

    m_webView = new QWebEngineView();
    QWebEnginePage *page = new QWebEnginePage(this); //创建一个网页视图对象
    m_webView->setPage(page);

    QWebChannel *channel = new QWebChannel(this); //为网页视图页面创建通道channel
    channel->registerObject(QStringLiteral("document"), &m_document);//注册通道对象供JS调用,"document"为注册名,JS调用的对象名必须和它相同
    page->setWebChannel(channel); //设置通道
// qt端和HTML页面之间交互要用到的类
class Document : public QObject
{
    Q_OBJECT

public:
    explicit Document(QObject *parent = nullptr){}

    void sendText(const QString &text)
    {
        emit textSent(text);//发送给html页面
    }

public slots:
    //在HTML端的JavaScript中调用,在qt端显示
    void receiveText(const QString &text)
    {
        emit textReceived(text);//发送给主界面
    }

signals:
    //发送消息给HTML页面(此信号在html端的JavaScript中进行连接)
    void textSent(const QString &text);

    //发送消息给主界面
    void textReceived(const QString &text);
};

在页面中加载qwebchannel.js,这样就可以在js中创建QWebChannel对象,然后通过Document对象互发消息

 

WebEngineView中使用 

Qt封装的东西用法还是比较简单的,在QML中的用法流程原理是一样的,代码如下:

    WebChannel {
        id: webchannel2

    }

    Document {
        id: docObj

        onTextReceived: function(msg){
            console.log("recv msg" + msg)
        }

        Component.onCompleted: {
            webchannel2.registerObject("document", docObj)
        }
    }

    WebEngineView {
        id: webView
        anchors.fill: parent
        anchors.leftMargin: leftRect.width
        webChannel: webchannel2

        url: "qrc:/index.html"
    }

Document用的和上面例子是同一个类,只是注册到qml来使用,网页端代码不变。通信类也可以直接创建QtObject的QML类型,实现一套信号和槽也可以。

在第三方页面中使用

上面的实现是自己写的html页面,html里能引入qwebchannel.js和创建QWebChannel对象,但第三方网页是人家写好的,我们该如何使用呢?

这就需要用到我们之前了解到的注入javascript技术。

网页加载完成后,注入qwebchannel.js的内容,通信之前注入js创建QWebChannel对象就可以了。

    WebEngineView {
        id: webView
        anchors.fill: parent
        anchors.leftMargin: leftRect.width
        webChannel: webchannel2

        url: "qrc:/index.html"

        onLoadingChanged: function(loadRequest) {
            if (loadRequest.status === WebEngineView.LoadSucceededStatus) {
                //注入qwebchannel.js
                webView.runJavaScript(docObj.getWebchannelJs())
                //创建QWebChannel对象,并设置send点击效果
                var test = "var content = null; new QWebChannel(qt.webChannelTransport, function(channel){content = channel.objects.document;content.receiveText(\"redy.....\");});document.getElementById(\"send\").onclick = function(){var input = document.getElementById(\"input\");content.textSent.connect(function(message){output(\"recv data: \" + message);});var text = input.value;if (!text){return;}input.value = \"\";content.receiveText(text);}"
                webView.runJavaScript(test)
            }
        }
    }

需要注意的是需要定义document对象为全局变量,代码中用content接收document作为全局变量,这样其他地方才能使用document对象。

结语

关于QWebChannel实现与网页的通信就这些内容,因为网上基本都是基于QWebEngineView实现的,这里做了WebEngineView中使用的说明。

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

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

相关文章

RocketMQ5.0消息消费<二> _ 消息队列负载均衡机制

RocketMQ5.0消息消费<二> _ 消息队列负载均衡机制 一、消费队列负载均衡概览 RocketMQ默认一个主题下有4个消费队列,集群模式下同一消费组内要求每个消费队列在同一时刻只能被一个消费者消费。那么集群模式下多个消费者是如何负载主题的多个…

第四十四章Java访问对象的属性和行为以及销毁

Java访问对象的属性和行为 每个对象都有自己的属性和行为,这些属性和行为在类中体现为成员变量和成员方法,其中成员变量对应对象的属性,成员方法对应对象的行为。 在Java中,要引用对象的属性和行为,需要使用点…

【MySQL 】MySQL 创建数据库, MySQL 删除数据库,MySQL 选择数据库

作者简介: 辭七七,目前大一,正在学习C/C,Java,Python等 作者主页: 七七的个人主页 文章收录专栏: 七七的闲谈 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖&#x1f…

iPhone苹果手机桌面上快速记录笔记的步骤

现在越来越多的人喜欢上记笔记,因为记笔记是一种提升效率和组织思维的重要方式。随着移动设备的普及,手机逐渐成为我们生活中不可或缺的工具之一。在手机上记笔记就成为一种很快捷的记录方式,可以让我们随时随地记录灵感和重要信息。在众多记…

计算机体系结构基础知识介绍之动态调度Tomasulo 算法(二)

Tomasulo方法是一种计算机硬件架构的算法,用于动态调度指令的执行,允许乱序执行以及更有效率的使用多个执行单元。它由IBM公司在1967年提出,首次应用是在IBM System/360 Model 91的浮点单元上。Tomasulo方法的主要创新包括在硬件中进行寄存器…

轻松学习阿里云原生内存数据库Tair

📖轻松学习阿里云原生内存数据库Tair 🚀前言☁️什么是Redis?☁️什么是云原生内存数据库?✨特点 🚀阿里云原生内存数据库Tair👻简介✨功能特性🗺️应用场景 ✍️上手案例🎯 基于Red…

PCB笔记(PCB设计流程)

双层PCB设计流程(以AD10为例) 1. Preferences常规设置2. 画好原理图后3.编译工程,看是否有错4.然后执行更新到PCB5. 布线前常规规则设置6. 布局之后开始布线7.布线结束之后,开始铺铜8. 创建铜皮之前调丝印,将所有丝印调…

力扣 -- 剑指 Offer II 091. 粉刷房子

题目链接:剑指 Offer II 091. 粉刷房子 - 力扣(LeetCode) 下面是用动态规划的思想解决这道题的过程,相信各位小伙伴都能看懂并且掌握这道经典的动规题目滴。 参考代码: class Solution { public:int minCost(vector…

MIT 6.S081 教材第八章内容 -- ext3 -- 05

MIT 6.S081 教材第八章内容 -- ext3 -- 05 引言为什么需要日志系统XV6 File system logging回顾ext3 file system log formatext3如何提升性能ext3文件系统调用格式ext3 transaction commit步骤ext3 file system恢复过程为什么新transaction需要等前一个transaction中系统调用执…

FFMPEG 编译流程(极客版)

前言 依葫芦画瓢 全程30分钟从零完成ffmpeg编译,主打的就是一个极客 编译环境 OS 要求:Ubuntu 20.04 LTS VMware新建虚拟机 NDK 要求:android-ndk-r20b FFmpeg 功能模块: libavformat:多媒体文件或协议的封装和解封装库&a…

DynaSLAM代码详解(5) — Tracking.cc跟踪线程

目录 5.1 DynaSLAM中Tracking线程简介 5 .2 RGBD模式下跟踪流程 5.3 DynaSLAM的低成本跟踪 (1) Tracking::LightTrack() 低成本跟踪函数 (2) Tracking::LightTrackWithMotionModel() 低成本的恒速模型跟踪流程 5.4 DynaSLAM的正常跟踪 文章着重将与ORB-SLAM2不同的地方&a…

智能工厂:智能制造数字化转型解决方案

数字化已经成为制造业发展的必由之路。要提高生产效率和管理水平,就需要提高对生产运维各环节的数据采集、处理和利用效率。当前工厂的数据采集仍存在诸多不足,可以利用具有多种设备接入能力、通信协议转换能力、数据通信能力、控制维护能力的工业智能网…

UE5《Electric Dreams》项目PCG技术解析 之 PCGCustomNodes详解(一)

《Electric Dreams》项目中提供了一些自定义节点和子图(文件位置:“/Content/PCG/Assets/PCGCustomNodes”),这些节点和子图在《Electric Dreams》被广泛使用,对于理解《Electric Dreams》非常重要,而且它们可以直接移…

Qt的对话框与窗口--多文档界面MDI(Multi-document Interface))

多文档界面MDI MDI应用程序就是在主窗口里创建多个同类型的MDI子窗口,这些MDI子窗口在主窗口里显示,并共享主窗口上的工具栏和菜单等操作功能,主窗口上的操作都针对当前活动的MDI子窗口进行。 设计MDI应用程序需要在主窗口工作区放置一个QMdi…

MySQL:我的从库竟是我自己!?

本文将通过复制场景下的异常分析,介绍手工搭建MySQL主从复制时需要注意的关键细节。 作者:秦福朗 爱可生 DBA 团队成员,负责项目日常问题处理及公司平台问题排查。热爱互联网,会摄影、懂厨艺,不会厨艺的 DBA 不是好司机…

多行文本转成一行的实现方法

哈喽大家好,我是咸鱼 不知道你们有没有遇到过下面的情况,以我为例 有时候我会收到批量操作服务器的需求,且我会拿到一个服务器 ip 列表,它是一个多行的形式,如下所示 # ip 列表 192.168.0.1 192.168.0.2 192.168.0.…

原油天然气的区别和用途

原油天然气在市场交易中都是重要的交易产品,经常有小伙伴在后台咨询Forexclub,原油天然气的区别和用途,今天这篇文章就和小伙伴一起交流研究。 其实在Forexclub看来原油和天然气的提取方法、来源和用途几乎相同,只是在适用范围和运…

推荐系统构建

从0到1打造推荐系统工程实战_推荐系统_Jay Wu_InfoQ写作社区

并行程序设计 pthread

配置环境 pthread是c的扩展库,需要配置环境,不过vscode的mingw里面本来就有,谢谢呢^_^ cd “d:\sylvia\文件夹等等等” ; if ($?) { g helloworld.cpp -o helloworld } ; //编译 if ($?) { .\helloworld 线程数} //运行 常用变量声明及函…

三雄极光“设计有光·亚洲设计师迪拜对话”逐光之旅圆满收官

7月8日,三雄极光照明学院“设计有光亚洲设计师迪拜对话”游学旅程圆满收官。过去两周内,此次活动备受关注,设计大咖纷纷为此次迪拜游学一带一路逐光之旅打call。出发前,启动礼于三雄极光总部隆重举行,总裁张宇涛出席并…