Qt与Web混合开发:实现双向通信

news2024/11/25 20:32:07

引言

在当今的软件开发中,将Qt和Web技术结合起来进行混合开发变得越来越流行。Qt作为强大的C++框架,提供了丰富的图形界面和功能库,而Web技术则提供了灵活性和跨平台的优势。结合这两种技术,我们可以开发出功能强大、具有吸引力的应用程序。本博客将介绍如何实现Qt与Web之间的双向通信,通过使用QWebChannel和JavaScript桥接的方式,让我们开始吧!

QWebChannel简介

QWebChannel填补了C++应用程序和HTML/JavaScript应用程序之间的空白。通过将QObject派生对象发布到QWebChannel并在HTML中引用qwebchannel.js脚本。在HTML端,可以透明地访问QObject的属性、公共槽和方法。无需手动传递消息和数据序列化,C++方面的属性更新和信号发射将自动传输到可能远程运行的HTML客户机。在客户端,将为任何发布的C++ QObject创建JavaScript对象。它镜像C++对象的API,因此可以直观地使用。

C++ 端

创建QObject派生类

首先,在C++端,我们需要创建一个继承自QObject的类,用于在Qt和Web之间传递数据和调用函数。例如,我们创建一个名为MyObject的类,并在其中声明一些槽函数和信号:

myobject.h

#include <QObject>
#include <QString>

class MyObject : public QObject
{
    Q_OBJECT

public:
    explicit MyObject(QObject *parent = nullptr);

public slots:
    void myFunction(const QString &message);
    void sendMessage(const QString &message);

signals:
    void sig_sendMessage(const QString &message);

};

myobject.cpp

#include "myobject.h"

#include <QDebug>

MyObject::MyObject(QObject *parent)
    : QObject{parent}
{

}

void MyObject::myFunction(const QString &message)
{
    qDebug() << message;
}

void MyObject::sendMessage(const QString &message)
{
    emit sig_sendMessage(message);
    qDebug() << message;
}

注册QObject派生类

在C++端,我们创建一个QWebEngineView,并将MyObject对象添加到Web通道中:

#include <QApplication>
#include <QWebChannel>
#include <QWebEngineView>

#include "myobject.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QWebEngineView *webView = new QWebEngineView();
    QWebChannel *channel = new QWebChannel();

    MyObject *myObject = new MyObject();
    channel->registerObject(QStringLiteral("myObject"), myObject);

    webView->page()->setWebChannel(channel);
    webView->load(QUrl("file:///C:/Users/yxc/Desktop/untitled/bmdemo.html")); // 路径根据实际情况
    webView->show();

    return app.exec();
}

Web端

在Web端,我们需要在HTML页面中加载QWebChannel的JavaScript库,并使用JavaScript与Qt进行交互。通过使用Qt对象的名称(在本例中为"myObject"),我们可以访问Qt对象的函数和信号:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>bm qt + web test</title>
    <script src="./qwebchannel.js"></script>
    <script type="text/javascript">
        var myObject;
        var webChannel = new QWebChannel(qt.webChannelTransport, function (channel) {
            myObject = channel.objects.myObject;
        });

        function myFunction() {
            // 调用Qt函数
            myObject.myFunction("Hello from Web");
        }

        function sendMessage() {
            // 发送信号到Qt
            myObject.sendMessage("Message from Web");
        }
    </script>
</head>

<body>
    <button id="myFunction" onclick="myFunction()">my function</button>
    <button id="sendMessage" onclick="sendMessage()">send message</button>
</body>

</html>

运行和测试

运行应用程序,Qt应用程序将加载Web页面,并在控制台上显示来自Web的消息。通过Qt对象的槽函数,我们可以处理从Web发送的消息,或者通过信号与Web进行通信。

测试结果如图所示:

在这里插入图片描述

结论

通过使用Qt WebChannel和JavaScript桥接,我们可以实现Qt与Web之间的双向通信。这种混合开发的方法可以让我们充分利用Qt的强大功能和Web技术的灵活性,开发出功能丰富、交互性强的应用程序。本文介绍了QWebChannel的基本概念和用法,并提供了一个简单的示例来演示如何在Qt和Web之间进行通信。希望这篇博客能够为您深入了解Qt与Web混合开发提供一个良好的起点。

在实际开发中,你可以根据具体需求进一步扩展和定制这种通信机制,并结合您的创意和应用场景,实现更多功能丰富的交互体验。祝你在Qt与Web混合开发的旅程中取得成功。

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

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

相关文章

【电路原理学习笔记】第4章:能量与功率:4.2 电路中的功率

第4章&#xff1a;能量与功率 4.2 电路中的功率 电能转换成热能所产生的热量&#xff0c;通常是电流通过电路中的电阻而产生的不必要的副产品。然而&#xff0c;在某些情况下&#xff0c;产生热量是电路的主要目的&#xff0c;例如&#xff0c;电阻式加热器。 当有电流通过电…

NLP 开源形近字算法之相似字列表(番外篇)

需求 有时候我们并不是需要返回两个字的相似&#xff0c;而是需要返回一个汉字的相似列表。 实现思路 我们可以分别计算所有的汉字之间的相似度&#xff0c;然后保留最大的前100个&#xff0c;放在字典中。 然后实时查询这个字典即可。 实现方式 bihuashu_2w.txt 中我们主…

BUG解决Button类不能从UnityEngine.UI中引用

Button does not contain a definition for onClick and no accessible extension method onClick accepting a first argument of type Button could be found (are you missing a using directive or an assembly reference?) 一个非常奇葩的问题;突然!!!!! using UnityEn…

什么是低代码开发平台(apaas)?低代码开发平台的价值有哪些

手码6500字&#xff0c;带你快速看懂&#xff1a;什么是低代码开发平台&#xff08;apaas&#xff09;&#xff0c;低代码有哪些价值&#xff0c;以及低代码平台的使用逻辑和心得。 一、什么是低代码开发平台&#xff08;apaas&#xff09;&#xff1f; 低代码开发平台是一种a…

【C++ 学习记录】(一)--你好,C++

写在前面 工作需要&#xff0c;重学C&#xff0c;实在是太痛苦了&#xff0c;大二的时候应试就没学会&#xff01;&#xff01; 进入正题 1.编程是怎么回事 C在百科上的解释是一种静态数据类型检查 的、支持多种编程范式&#xff08;面向过程与面向对象等&#xff09;的通用…

BTP Integration Suite学习笔记 - (Unit3) Developing with SAP Integration Suite

BTP Integration Suite学习笔记 - (Unit1) Developing with SAP Integration Suite BTP Integration Suite学习笔记 - (Unit2) Developing with SAP Integration Suite 带着一个问题去学&#xff1a;明明可以直接访问一个后端系统的OData服务&#xff0c;为什么还要再多绕一道C…

UE学习记录02----UMG创建控件模板+事件分发器

官网4.27&#xff1a; 创建控件模板 | 虚幻引擎文档 (unrealengine.com) 使用UMG创建的每个 控件蓝图 都被视为 用户控件&#xff0c;其可在其他控件蓝图中重复使用和放置。 其视觉效果和脚本功能都将延续到该蓝图中。 利用某些蓝图脚本&#xff0c;可创建UI控件的运行方式或…

echarts——环形图

const value_ze 60 const value2_ze 30 var myChart echarts.init(document.getElementById(myChart)); var option {title: {text: 目标完成率,subtext: [{a|${value_ze}}, {b|%}].join(),itemGap: 10,textStyle: {fontSize: 14,color: #fff,fontWeight: 500},subtextStyl…

springboot拦截器无法进行属性注入

文章目录 问题描述问题原因问题解决解决方法一解决方法二 总结 问题描述 今天在使用拦截器的时候遇见了一个奇怪的错误&#xff0c;就是在对拦截器进行属性注入的时候为null&#xff0c;具体如下 运行代码出现空指针异常 就是注入的Gson为null&#xff0c;这个问题很奇怪&a…

STM32 HAL库定时器输入捕获SlaveMode脉宽测量

STM32 HAL库定时器输入捕获SlaveMode脉宽测量 SlaveMode模式简介 ✨SlaveMode复位模式&#xff1a;在发生一个触发输入事件时&#xff0c;计数器和它的预分频器能够重新被初始化&#xff1b;同时&#xff0c;如果TIMx_CR1寄存器的URS位为低&#xff0c;还会产生一个更新事件UEV…

SQLSERVER中exec 与 exec sp_executesql 的用法及比较

SQLSERVER 提供 exec 与 exec sp_executesql &#xff08;2005版本开始&#xff09;执行动态sql。 一、EXEC 命令有两种用法 1、执行存储过程 exec 存储过程 参数 值 --或 exec 存储过程 值 exec 存储过程 存储过程中的参数参数{接受参数返回值} outputCREATE PROC…

空气净化器触摸屏中应用的电容式触摸芯片

现在人们对于居住环境要求较高&#xff0c;许多家庭会选用空气净化器吸咐污物。那么空气净化器原理是什么&#xff1f;空气净化器工作原理分为两种&#xff1a; 被动式空气净化器原理&#xff1a;是用风机将空气抽入机器&#xff0c;通过内部的滤网过滤空气&#xff0c;起到过滤…

亚马逊气候友好碳中和认证

CLIMATE PLEDGE FRIENDLY AND CARBON NEUTRAL Climate Pledge Friendly气候友好认证&#xff0c;亚马逊推出的气候友好认证是一种自愿性&#xff0c;倡导性的认证。那么这个Climate Pledge Friendly是个什么样的认证&#xff0c;如何才能获得这个气候友好认证标签呢&#xff1…

使用onnx和onnxruntime完成模型部署

模型部署定义 深度学习模型部署是指训练好的模型在特定环境中运行的过程。 模型部署的流水线如下&#xff1a; 使用任意一种深度学习框架来定义网络结构并训练模型训练好的模型的网络结构和参数会被转换成一种只描述网络结构的中间表示&#xff08;如&#xff0c;onnx、torch…

Shiro 初识

1&#xff0c;了解Shiro Shiro是一个安全框架&#xff0c;主要用于用户认证&#xff0c;访问授权&#xff0c;会话管理&#xff0c;数据加密 2&#xff0c;实践 2.1 创建文件 这个例子没有链接数据库&#xff0c; 所以需要在resources下创建文件shiro.ini shiro.ini内容&am…

Vant源码解析(三)van-stepper步进器

先说下自己的开发思路&#xff0c;然后在对照下vant组件的思路&#xff0c;来查找下自己的不足。 这个步进器有加和减的功能&#xff0c;还有输入的功能&#xff0c;限制最小和最大的功能。 我理解的Vant组件的思路 点击事件都是onTap,根据变量进行判断是加还是减&#xff0c;数…

vuecli5.x 配置图片输出为base64

解释&#xff1a;webpack的默认配置是小于一定的文件大小就要将图片转为base64, 所以尽量将这个阈值调大你的图片就可以转为base64; 当然这种做法不好, 会导致代码文件变大, 不过为了满足需求也没得办法。这年头大家都用 vite 了, 网上没有 vuecli5.x 这方面的记录, 写篇文章记…

腾讯内推 | 互联网大厂内推

分享 WLB、大厂内推&#xff0c;面经、热点新闻&#xff0c;可内推公司90&#xff0c;累计帮助6000 靠谱的内推君 专注于WLB、大厂精选内推&#xff0c;助力每位粉丝拿到满意的Offer&#xff01; 公司简述 腾讯以技术丰富互联网用户的生活。通过通信及社交平台微信和 QQ 促…

单模光模块和多模光模块有何区别,如何选择?

随着数据中心和5G应用的高速发展&#xff0c;光模块渐渐被越来越多的人所熟知&#xff0c;也得到了广泛应用。我们都知道&#xff0c;光模块可以根据参数类型来区分&#xff0c;如我们经常提到的单模光模块和多模光模块。那你知道单模光模块和多模光模块中的单模和多模分别代表…

基于物联网、移动互联网、一物一码等技术开发的质量溯源系统源码

什么是溯源系统? 溯源系统是物联网、移动互联网、一物一码等技术的整合应用。在产品生产过程中在重要环节可采集产品数据信息并形成产品溯源档案。从而形成产品从原料、生产加工、质量检测、物流运输等环节的信息监控。 溯源系统技术架构 技术架构&#xff1a;spring bootmy…