QWebChannel实现与JS的交互

打印 上一主题 下一主题

主题 858|帖子 858|积分 2574

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文件参加模块引用
  1. QT += webenginewidgets webchannel
复制代码
MyProjectWidget.h
  1. #pragma once
  2. #include <QWebEngineView>
  3. #include <QtWebChannel>
  4. #include <QtWidgets/QWidget>
  5. #include <QPushButton>
  6. #include "WebClass.h"
  7. QT_BEGIN_NAMESPACE
  8. namespace Ui { class MyProjectWidget; }
  9. QT_END_NAMESPACE
  10. class MyProjectWebView;
  11. class MyProjectWidget : public QWidget {
  12.     Q_OBJECT
  13. public:
  14.     explicit MyProjectWidget(QWidget *parent = nullptr);
  15.     ~MyProjectWidget() override;
  16. public Q_SLOTS:
  17.     void sendToJS();
  18.     void receiveFromJS(const QString &data);
  19. private:
  20.     Ui::MyProjectWidget *ui;
  21.     QPushButton *button;
  22.     QWebEngineView *webView = nullptr;
  23.     QWebChannel *webChannel = nullptr;
  24.     QWebEngineView *m_consoleView = nullptr;
  25.     WebClass *webobj;
  26.     int numer = 0;
  27. };
复制代码
MyProjectWidget.cpp
  1. #include "MyProjectWidget.h"
  2. #include "ui_MyProjectWidget.h"
  3. #include <QtCore/QSysInfo>
  4. #include <QtCore/qglobal.h>
  5. #include <QtNetwork/QHostInfo>
  6. #include "MyProjectWebView.h"
  7. #include <QShortcut>
  8. MyProjectWidget::MyProjectWidget(QWidget *parent)
  9. : QWidget(parent)
  10. , ui(new Ui::MyProjectWidget) {
  11.     ui->setupUi(this);
  12.     button = new QPushButton ("Send Message to JavaScript");
  13.     webView = new QWebEngineView(parent);
  14. #ifdef QT_DEBUG
  15.     // F12 调试窗口
  16.     QShortcut* shortcut = new QShortcut(QKeySequence(Qt::Key_F12), this);
  17.     setShortcutEnabled(shortcut->id(), true);
  18.     QObject::connect(shortcut, &QShortcut::activated, this, [&]() mutable {
  19.         if (m_consoleView == nullptr)
  20.             m_consoleView = new QWebEngineView();
  21.         webView->page()->setDevToolsPage(m_consoleView->page());
  22.         webView->page()->triggerAction(QWebEnginePage::InspectElement);
  23.         m_consoleView->show();
  24.     });
  25. #endif // QT_DEBUG
  26.     //webView->load(QStringLiteral("qrc:/index.html"));
  27.     webView->load(QUrl::fromLocalFile("F:\\test_qt\\js\\data\\index.html"));
  28.     ui->vLayMain->addWidget(button);
  29.     ui->vLayMain->addWidget(webView);
  30.     webChannel = new QWebChannel;
  31.     webobj = new WebClass();
  32.     webChannel->registerObject("webobj", webobj);
  33.     webView->page()->setWebChannel(webChannel);
  34.     QObject::connect(button, &QPushButton::clicked, this, &MyProjectWidget::sendToJS);
  35.     QObject::connect(webobj, &WebClass::strDataChanged, this, &MyProjectWidget::receiveFromJS);
  36. }
  37. MyProjectWidget::~MyProjectWidget() {
  38.     delete ui;
  39. }
  40. void MyProjectWidget::sendToJS()
  41. {
  42.     QString numberstr = QString::number(numer++);
  43.     QJsonObject json;
  44.     json["key1"] = "https://kfb-dc-store.obs.cn-east-2.myhuaweicloud.com/123.xls";
  45.     numberstr = QString::number(numer++);
  46.     json["key2"] = "https://kfb-dc-store.obs.cn-east-2.myhuaweicloud.com/577.xls";
  47.     webobj->setProperty("jsonData", json);
  48. }
  49. void MyProjectWidget::receiveFromJS(const QString &data)
  50. {
  51.     qDebug() << "receiveFromJS:" << data;
  52.     QByteArray parameterArray = data.toUtf8();
  53.     QJsonDocument jsonDocument = QJsonDocument::fromJson(parameterArray);
  54.     qDebug() << "jsonDocument:" << jsonDocument;
  55. }
复制代码
WebClass.h
  1. #pragma once
  2. #include <QtCore/QObject>
  3. #include <QJsonObject>
  4. #include <QMessageBox>
  5. class WebClass : public QObject {
  6.     Q_OBJECT
  7.     Q_PROPERTY(QJsonObject jsonData MEMBER m_jsonData NOTIFY dataChanged)
  8.     Q_PROPERTY(QString m_data MEMBER m_data NOTIFY strDataChanged)
  9. public:
  10.     WebClass(QObject* parent = nullptr){};
  11.     ~WebClass() override {};
  12. signals:
  13.     void dataChanged(const QJsonObject &jsonData);
  14.     void strDataChanged(const QString &data);
  15. private:
  16.     QJsonObject m_jsonData;
  17.     QString m_data;
  18. };
复制代码
main.cpp
  1. #include <QApplication>
  2. #include <QDesktopServices>
  3. #include <QWebEnginePage>
  4. #include <QWebEngineProfile>
  5. #include <QWebEngineView>
  6. #include "MyProjectWidget.h"
  7. int main(int argc, char *argv[])
  8. {
  9.     QCoreApplication::setOrganizationName("QtExamples");
  10.     QApplication app(argc, argv);
  11.     MyProjectWidget myProject;
  12.     myProject.show();
  13.     return app.exec();
  14. }
复制代码
index.html
  1. <!DOCTYPE html>
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4.     <meta charset="utf-8">
  5.     <!-- 引入 ECharts 文件 -->
  6.     <script src="F:/test_qt/js/data/echarts.min.js"></script>
  7.     <title>Fetch JSON Example</title>
  8. </head>
  9. <p id="x">x:</p>
  10. <p id="y">y:</p>
  11. <body>
  12.     <script src="qwebchannel.js"></script>
  13.     <script type="text/javascript">
  14.     var webobj;
  15.         new QWebChannel(qt.webChannelTransport, function (channel) {
  16.                 webobj = channel.objects.webobj;
  17.                 webobj.dataChanged.connect(function (arg) {
  18.                     console.log(arg.key1);
  19.                     x.innerHTML = arg.key1;
  20.                     y.innerHTML = arg.key2;
  21.                 });
  22.             });
  23.         function sendMessageToQt() {
  24.             console.log("12354");
  25.             const json = JSON.stringify({ key: 'value' ,age: "30", city: "New York"});
  26.             webobj.m_data = json;
  27.         }
  28.     </script>
  29.   <button onclick="sendMessageToQt()">Send Message to qt</button>
  30. </body>
  31. </html>
复制代码
如许就实现了qt和H5的json对象传递了。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

罪恶克星

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表