QWebChannel实现与JS的交互
创始人
2024-11-06 09:10:22
0

QWebChannel实现与JS的交互

在利用Qt框架的QWebEngineView进行嵌入浏览器开发时,可以很方便的通过
QWebChannel实现与js的交互,本节内容简单讲解js与Qt应用程序相互发送消息。

最近做项目遇到了这个问题,发现网上的例子不全,很多都是单向通讯。自己实现了这部分,简单记录一下

在使用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 += webenginewidgets webchannel 

MyProjectWidget.h

#pragma once #include  #include  #include  #include  #include "WebClass.h"  QT_BEGIN_NAMESPACE namespace Ui { class MyProjectWidget; } QT_END_NAMESPACE  class MyProjectWebView;  class MyProjectWidget : public QWidget {     Q_OBJECT  public:     explicit MyProjectWidget(QWidget *parent = nullptr);     ~MyProjectWidget() override;  public Q_SLOTS:     void sendToJS();     void receiveFromJS(const QString &data);  private:     Ui::MyProjectWidget *ui;     QPushButton *button;     QWebEngineView *webView = nullptr;     QWebChannel *webChannel = nullptr;     QWebEngineView *m_consoleView = nullptr;      WebClass *webobj;      int numer = 0; };  

MyProjectWidget.cpp

#include "MyProjectWidget.h" #include "ui_MyProjectWidget.h" #include  #include  #include  #include "MyProjectWebView.h" #include    MyProjectWidget::MyProjectWidget(QWidget *parent) : QWidget(parent) , ui(new Ui::MyProjectWidget) {     ui->setupUi(this);      button = new QPushButton ("Send Message to JavaScript");      webView = new QWebEngineView(parent); #ifdef QT_DEBUG      // F12 调试窗口     QShortcut* shortcut = new QShortcut(QKeySequence(Qt::Key_F12), this);     setShortcutEnabled(shortcut->id(), true);     QObject::connect(shortcut, &QShortcut::activated, this, [&]() mutable {         if (m_consoleView == nullptr)             m_consoleView = new QWebEngineView();          webView->page()->setDevToolsPage(m_consoleView->page());         webView->page()->triggerAction(QWebEnginePage::InspectElement);         m_consoleView->show();     }); #endif // QT_DEBUG      //webView->load(QStringLiteral("qrc:/index.html"));     webView->load(QUrl::fromLocalFile("F:\\test_qt\\js\\data\\index.html"));      ui->vLayMain->addWidget(button);     ui->vLayMain->addWidget(webView);       webChannel = new QWebChannel;     webobj = new WebClass();     webChannel->registerObject("webobj", webobj);     webView->page()->setWebChannel(webChannel);      QObject::connect(button, &QPushButton::clicked, this, &MyProjectWidget::sendToJS);      QObject::connect(webobj, &WebClass::strDataChanged, this, &MyProjectWidget::receiveFromJS); }  MyProjectWidget::~MyProjectWidget() {     delete ui; }  void MyProjectWidget::sendToJS() {     QString numberstr = QString::number(numer++);     QJsonObject json;     json["key1"] = "https://kfb-dc-store.obs.cn-east-2.myhuaweicloud.com/123.xls";     numberstr = QString::number(numer++);     json["key2"] = "https://kfb-dc-store.obs.cn-east-2.myhuaweicloud.com/577.xls";     webobj->setProperty("jsonData", json); }  void MyProjectWidget::receiveFromJS(const QString &data) {     qDebug() << "receiveFromJS:" << data;      QByteArray parameterArray = data.toUtf8();     QJsonDocument jsonDocument = QJsonDocument::fromJson(parameterArray);      qDebug() << "jsonDocument:" << jsonDocument; }  

WebClass.h

#pragma once  #include  #include  #include   class WebClass : public QObject {     Q_OBJECT     Q_PROPERTY(QJsonObject jsonData MEMBER m_jsonData NOTIFY dataChanged)     Q_PROPERTY(QString m_data MEMBER m_data NOTIFY strDataChanged)  public:     WebClass(QObject* parent = nullptr){};     ~WebClass() override {};  signals:     void dataChanged(const QJsonObject &jsonData);     void strDataChanged(const QString &data); private:     QJsonObject m_jsonData;     QString m_data; };  

main.cpp

#include  #include  #include  #include  #include  #include "MyProjectWidget.h" int main(int argc, char *argv[]) {     QCoreApplication::setOrganizationName("QtExamples");     QApplication app(argc, argv);     MyProjectWidget myProject;     myProject.show();     return app.exec(); }   

index.html

                       Fetch JSON Example  

x:

y:

这样就实现了qt和H5的json对象传递了。

相关内容

热门资讯

透视讲解!aapoker怎么选... 透视讲解!aapoker怎么选牌(透视)aapoker透视插件,第三方教程(有挂解密)1、任何aap...
透视能赢!德扑圈有透视吗(透视... 透视能赢!德扑圈有透视吗(透视)辅助器app(有挂黑科技)1、德扑圈有透视吗透视辅助简单,德扑圈有透...
透视计算“hardrock作弊... 透视计算“hardrock作弊”智星德州可以透视吗(透视)新2025版(总是真的有挂)智星德州可以透...
透视实锤!aapoker怎么控... 透视实锤!aapoker怎么控制牌(透视)aapoker透视脚本下载,AA德州教程(有挂介绍)透视实...
透视科技!德扑圈透视挂(透视)... 透视科技!德扑圈透视挂(透视)透视辅助软件下载(有挂规律)德扑圈透视挂辅助器中分为三种模型:德扑圈透...
透视好友房“德州透视是真的吗”... 透视好友房“德州透视是真的吗”pokemmo脚本手机版(透视)系统教程(切实真的是有挂);1、进入到...
透视能赢!aapoker发牌逻... 透视能赢!aapoker发牌逻辑(透视)aapoker俱乐部靠谱吗,2025新版总结(有挂方法)aa...
透视能赢!德普之星私人局辅助免... 透视能赢!德普之星私人局辅助免费(透视)私人局辅助免费(有挂黑科技)1、构建自己的德普之星私人局辅助...
透视挂透视“哈糖大菠萝能开挂吗... 透视挂透视“哈糖大菠萝能开挂吗”uupoker有透视吗(透视)必备教程(切实是真的有挂)小薇(透视辅...
透视有挂!aapoker辅助插... 透视有挂!aapoker辅助插件工具(透视)aapoker免费透视脚本,扑克教程(有挂工具);1、超...