QWebChannel实现与JS的交互

06-01 1907阅读

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++交互的桥接技术:

QWebChannel实现与JS的交互
(图片来源网络,侵删)

作用:除了上述Qt提供的模块,还可以使用其他桥接技术来实现JavaScript与C++之间的通信,如Embind、Boost.JS等。这些技术允许在C++和JavaScript之间创建双向的函数调用和数据传递。

用法:您可以使用这些技术将C++函数暴露给JavaScript调用,并在C++中调用JavaScript函数。这样可以实现更紧密的集成和通信。

QWebChannel实现与JS的交互
(图片来源网络,侵删)

pro文件加入模块引用

QT += webenginewidgets webchannel

MyProjectWidget.h

QWebChannel实现与JS的交互
(图片来源网络,侵删)
#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() 
    
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

相关阅读

目录[+]

取消
微信二维码
微信二维码
支付宝二维码