首页 > 编程语言 >QtWebChannel和JavaScript进行通信(简单理解)

QtWebChannel和JavaScript进行通信(简单理解)

时间:2023-08-18 09:15:25浏览次数:82  
标签:Web QtWebChannel Qt JavaScript 通信 C++ 应用程序 message

说明

在使用Qt(C++)和JavaScript之间实现通信时,通常会使用一些模块和技术来使两者能够交互和传递数据。这种通信通常用于在Qt应用程序中嵌入Web内容,或者在Web页面中嵌入Qt应用程序。以下是一些常用的模块和技术,以及它们的作用

  • Qt WebEngine模块:

    作用:Qt WebEngine是Qt中的Web引擎,允许在Qt应用程序中嵌入Web内容,包括JavaScript脚 本。它基于Chromium,提供了一个完整的Web浏览器引擎。

    用法:您可以使用Qt WebEngine将Web页面嵌入到Qt应用程序中,并通过JavaScript与应用程序进行通信。这可以通过JavaScript和C++之间的信号和槽机制来实现。

  • Qt QWebChannel模块:

    作用:QWebChannel是一个用于在Qt和JavaScript之间进行通信的模块。它使Qt中的C++对象能够通过WebSocket与嵌入在Web页面中的JavaScript进行通信。

    用法:您可以使用QWebChannel在Qt应用程序和Web页面之间传递数据和调用函数。这样,您可以在Qt中暴露C++对象,使其可以在JavaScript中访问,反之亦然。

  • Qt QJSEngine模块:

    作用:QJSEngine是一个用于在Qt应用程序中执行JavaScript代码的模块。它允许您在C++中嵌入JavaScript,并在两者之间交换数据。

    用法:您可以使用QJSEngine在Qt应用程序中执行JavaScript代码,并通过QJSEngine来访问C++对象和数据。这在需要动态执行和控制JavaScript代码的情况下很有用。

  • JavaScript与C++交互的桥接技术:
    作用:除了上述Qt提供的模块,还可以使用其他桥接技术来实现JavaScript与C++之间的通信,如Embind、Boost.JS等。这些技术允许在C++和JavaScript之间创建双向的函数调用和数据传递。
    用法:您可以使用这些技术将C++函数暴露给JavaScript调用,并在C++中调用JavaScript函数。这样可以实现更紧密的集成和通信。

修改.pro文件

QT += core gui webenginewidgets

mainwindows.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QtWebChannel/QtWebChannel>  //包含头文件
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

#include <QMainWindow>

class QWebChannel;
class QPushButton;
class QLineEdit;
class QTextEdit;
class WebChannelObject;

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);

private slots://槽函数
    void sendMessage();//发送消息
    void receiveMessage(const QString &message);//接受消息

private:
    void setupUi();
    void setupWebChannel();
private:
    QPushButton *sendButton;
    QLineEdit *messageEdit;
    QTextEdit *messageList;
    QWebChannel *webChannel;
    WebChannelObject *webChannelObject;
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "webchannelobject.h"
#include <QtWidgets>
#include <QtWebChannel/QtWebChannel>
#include <QtWebEngineWidgets/QWebEngineView>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    setupUi();
    setupWebChannel();
//参数1 发出者 参数2是发出什么时触发  参数3 接收者  参数4 接收者怎么处理  
    connect(sendButton, &QPushButton::clicked, this, &MainWindow::sendMessage);//信号和槽对应

}

void MainWindow::sendMessage()
{
    QString message = messageEdit->text();

    // 将消息发送到JavaScript
    webChannelObject->sendMessageToJS(message);

    // 在Qt界面上显示发送的消息
    messageList->append("You: " + message);
    messageEdit->clear();
}

void MainWindow::receiveMessage(const QString &message)
{
    // 在Qt界面上显示接收的消息
    messageList->append("Friend: " + message);
}

void MainWindow::setupUi()
{
    QWidget *centralWidget = new QWidget;
    QVBoxLayout *layout = new QVBoxLayout;
    sendButton = new QPushButton("Send");
    messageEdit = new QLineEdit;
    messageList = new QTextEdit;
    messageList->setReadOnly(true);

    layout->addWidget(messageList);
    layout->addWidget(messageEdit);
    layout->addWidget(sendButton);
    centralWidget->setLayout(layout);
    setCentralWidget(centralWidget);
}

void MainWindow::setupWebChannel()
{
    QWebEngineView *webView = new QWebEngineView;
    webChannel = new QWebChannel(this);
    webView->page()->setWebChannel(webChannel);
    webView->setUrl(QUrl::fromLocalFile(qApp->applicationDirPath()+"/index.html")); // 加载HTML文件
    setCentralWidget(webView);

    // 创建一个对象用于Qt和JavaScript通信
    webChannelObject = new WebChannelObject;
    webChannel->registerObject(QStringLiteral("webChannelObject"), webChannelObject);
}

webchannelobject.h

#ifndef WEBCHANNELOBJECT_H
#define WEBCHANNELOBJECT_H
#include <QObject>

class WebChannelObject : public QObject
{
    Q_OBJECT

public:
    WebChannelObject(QObject *parent = nullptr);

signals:
    void messageReceived(const QString &message);

public slots:
    void sendMessageToJS(const QString &message);

};

#endif // WEBCHANNELOBJECT_H

webchannelobject.cpp

#include "webchannelobject.h"

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

void WebChannelObject::sendMessageToJS(const QString &message)
{
    emit messageReceived(message);
}

main.cpp

#include "mainwindow.h
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

index.html

<!DOCTYPE html>
<html>
  <head>
    <script src="E:\work\exercise\QtWebChannelAndJavaScript\qwebchannel.js"></script>
    <script>
      var webChannel;

      // 当页面加载完成时初始化WebChannel
      document.addEventListener("DOMContentLoaded", function () {
        new QWebChannel(qt.webChannelTransport, function (channel) {
//对应于webChannel->registerObject(QStringLiteral("webChannelObject"),webChannelObject);
          webChannel = channel.objects.webChannelObject;

          // 监听Qt发来的消息
          webChannel.messageReceived.connect(function (message) {
            showMessage(message);
          });
        });
      });

      function showMessage(message) {
        var messageList = document.getElementById("messageList");
        var p = document.createElement("p");
        p.textContent = "Friend: " + message;
        messageList.appendChild(p);
      }

      function sendMessage() {
        var messageInput = document.getElementById("messageInput");
        var message = messageInput.value;

        // 将消息发送到Qt
        webChannel.sendMessageToJS(message);

        // 在Web界面上显示发送的消息
        var messageList = document.getElementById("messageList");
        var p = document.createElement("p");
        p.textContent = "You: " + message;
        messageList.appendChild(p);

        // 清空输入框
        messageInput.value = "";
      }
    </script>
  </head>

  <body>
    <h1>Qt and JavaScript Chat Example</h1>
    <div id="messageList"></div>
    <input type="text" id="messageInput" placeholder="Enter your message..." />
    <button onclick="sendMessage()">Send</button>
  </body>
</html>

其他的通信模块

  • QtWebKit:
    作用:QtWebKit是一个用于在Qt应用程序中嵌入Web内容的模块,类似于Qt WebEngine。它基于Webkit引擎,支持JavaScript与C++的交互。

    用法:您可以使用QtWebKit将Web页面嵌入到Qt应用程序中,并使用类似QJSEngine的方法来实现JavaScript与C++之间的通信。

  • Qt QML和Qt Quick:
    作用:Qt QML是一种用于创建用户界面的声明性语言,而Qt Quick是一个用于创建现代、动态和流畅用户界面的技术。它允许在Qt应用程序中使用JavaScript来定义界面和逻辑,并与C++进行交互。

    用法:您可以在Qt Quick中使用JavaScript定义用户界面,并通过信号和槽机制或C++对象暴露给JavaScript进行交互。

  • WebSocket通信:
    作用:WebSocket是一种在Web浏览器和服务器之间进行双向通信的技术,也可以用于在Qt应用程序和Web页面之间进行通信。

    用法:您可以在Qt应用程序和Web页面中分别实现WebSocket客户端和服务器,通过WebSocket协议进行双向通信,传递数据和命令。

  • QtDBus:
    作用:QtDBus是一个用于在不同进程之间进行通信的模块,可以用于实现C++和JavaScript之间的通信,尤其是在不同进程中的情况下。

    用法:您可以使用QtDBus来定义接口和信号,然后在C++和JavaScript之间进行通信和数据传递。

  • WebSockets和REST API:
    作用:WebSockets和REST API是用于在Web应用程序和服务器之间进行通信的标准技术。您可以在Qt应用程序和Web页面中分别实现WebSocket通信或通过REST API进行数据交换。

  • 基于消息队列的通信:
    作用:您可以使用消息队列,如ZeroMQ、RabbitMQ等,来在Qt应用程序和Web页面之间进行异步通信。

    用法:通过将消息发送到消息队列,然后在另一侧进行监听和处理,可以实现C++和JavaScript之间的通信。

标签:Web,QtWebChannel,Qt,JavaScript,通信,C++,应用程序,message
From: https://www.cnblogs.com/doubleconquer/p/17638416.html

相关文章

  • JavaScript-数据类型
    JavaScript语言的每一个值,都属于某一种数据类型。JavaScript的数据类型,共有六种。(ES6又新增了Symbol和BigInt数据类型,本教程不涉及。)数值(number):整数和小数(比如1和3.14)。字符串(string):文本(比如HelloWorld)。布尔值(boolean):表示真伪的两个特殊值,即true(真)和false(假)。undefined:表......
  • Android Java静态变量通信和反射的前提是须要在同一进程内
    静态变量通信:java类中的static变量是属于类的,即使new了两个对象访问的也是同一个内存地址的static变量,也就是说可以通过static变量通信,但前提必须是这两个对象必须是同一个进程中的。父进程通过fork来复制出一个子进程的副本,根据原理,子进程拥有父进程的一份完整数据拷贝。同时由......
  • javascript学习笔记day3
    今天没做啥笔记都是些学了的基础知识,学的都是像while,switch这些基础的语法,下面带是笔记++i前置运算和i++后置运算的区别:前置运行先相加再计算,后端运算先计算完再++。比较符也有隐式转换brank退出循环continue退出本次循环继续下次循环 顺便把while的循环作业一起放上来了,这个......
  • JavaScript面试题3
    JavaScript31.移动端上什么是点击穿透?点击穿透有3种:点击穿透问题:点击蒙层(mask)上的关闭按钮,蒙层消失后发现触发了按钮下面元素的click事件跨页面点击穿透问题:如果按钮下面恰好是一个有.href属性的a标签,那么.页面就会发生跳转另一种跨页面点击穿透问题:这次没有mask了,直接......
  • Mosquitto使用介绍:轻松构建MQTT通信
    在物联网(IoT)领域,实现设备之间的高效通信是至关重要的。MQTT(MessageQueuingTelemetryTransport)是一种轻量级的消息传输协议,适用于各种物联网应用。而Mosquitto作为MQTT协议的代表,为开发者提供了便捷的通信方式。本文将介绍如何使用Mosquitto构建MQTT通信,实现设备间的数据传输和交......
  • JavaScript中的标识符和保留字
    标识符。简单地说,标识符就是一个名字。在JavaScript中,标识符用于为JavaScript代码中的常量、变量、属性、函数和类命名,还可用于为某些循环提供标签。JavaScript标识符必须以字母、下划线(_)或美元符号($)开头。后续字符可以是字母、数字、下划线或美元符号(数字不能作为第一个字符,以区......
  • Html+JavaScript实现手写签名
    前言Hello各位,本葡萄又来啦,今天遇到的场景是这样的:在日常业务流程中,经常需要某一流程环节中相关责任人员进行审批签字,早期许多公司为了省事就直接会把这位负责人的签名以键盘打字(楷体)的形式打印出来,但是这样的坏处就是会导致所有的负责人的签名都是一样的,没有美感,为了解决这个问......
  • 封装socket网络通信模块
    封装socket网络通信模块-network由于TCP、UDP客户端、服务端的操作流程固定,所以为了后期使用方便,把socket网络通信封装成网络模块并生成libnw.so共享库头文件network.h#ifndefNETWORK_H#defineNETWORK_H#include<netinet/in.h>#include<stdbool.h>#include<stdint.h>......
  • JavaScript面试题2
    JavaScript21.下面代码的输出是什么?functionsayHi0{ console.log(name);        console.log(age);        varname="Lydia";        letage=21;       }//打印出来:undefined和......
  • javascript学习笔记day2
    今天在b站跟学了黑马的前端js课程,因为是第一天学习都对于我们这种学过了的来说其实挺简单的,不过今天一边做公司的项目一边学习多少是有点时间不够的感觉,看样子明天要开二倍看了,下面是今天的笔记什么是js:javascript是人机交互的一种编程语言js由哪几部分组成:ECMAScript和webapis......