QWebEngineView与js交互

54 篇文章 1 订阅

Qt新版本使用QWebEngineView来展示html页面对QWebView不再进行维护了,QWebEngineView使用chromium内核将带来更好的用户体验。

对QWebView感兴趣的可以参考:http://blog.csdn.net/tujiaw/article/details/50372892

从QWebView到QWebEngineView,参考:http://blog.csdn.net/tujiaw/article/details/52075495

  • C++调用js很简单

    m_view->page()->runJavaScript("showAlert()");
  • js调用C++函数

     QWebChannel *channel = new QWebChannel(this);
    channel->registerObject("bridge", (QObject*)bridge::instance());
    m_view->page()->setWebChannel(channel);

注意这个bridget类最好是从QObject继承,不要直接使用Dialog,否则你会看到一些莫名其妙的错误日志,而且使用一个中间类也可以解耦C++与js/html之间的逻辑

源码如下,地址
main.cpp

#include "dialog.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Dialog w;
    w.show();

    return a.exec();
}

dialog.h

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>

namespace Ui {
class Dialog;
}

class QWebEngineView;
class Dialog : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();

private:
    Ui::Dialog *ui;
    QWebEngineView *m_view;
};

#endif // DIALOG_H

dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"
#include <QWebEngineView>
#include <QWebChannel>
#include <QDir>
#include <QDebug>
#include "bridge.h"

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);

    m_view = new QWebEngineView(this);
    QWebChannel *channel = new QWebChannel(this);
    channel->registerObject("bridge", (QObject*)bridge::instance());
    m_view->page()->setWebChannel(channel);
    m_view->page()->load(QUrl(QString("file:///%1/%2").arg(QApplication::applicationDirPath()).arg("index.html")));

    ui->viewLayout->addWidget(m_view);
    connect(ui->pbAlert, &QPushButton::clicked, [this]() {
        m_view->page()->runJavaScript("showAlert()");
    });
}

Dialog::~Dialog()
{
    delete ui;
}

bridge.h

#ifndef BRIDGE_H
#define BRIDGE_H

#include <QObject>

class bridge : QObject
{
Q_OBJECT
public:
    static bridge* instance();

public slots:
    void showMsgBox();

private:
    bridge();
};

#endif // BRIDGE_H

bridge.cpp

#include "bridge.h"
#include <QMessageBox>

bridge* bridge::instance()
{
    static bridge s_obj;
    return &s_obj;
}

bridge::bridge()
{
}

void bridge::showMsgBox()
{
    QMessageBox::aboutQt(0, tr("Qt"));
}

index.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>test</title>
    <script src="./qwebchannel.js"></script>
  </head>
  <body style="background:#282c34;">
    <h3 style="color:#ffffff;">this is web page</h3>
    <input type="button" value="C++ function callback" onclick="onShowMsgBox()">
    <script>
      new QWebChannel(qt.webChannelTransport, function(channel) {
        window.bridge = channel.objects.bridge;
      })
      function onShowMsgBox() {
        if (bridge) {
          bridge.showMsgBox()
        }
      }

      function showAlert() {
        alert('this is web alert');
      }
    </script>
  </body>
</html>

qwebchannel.js是Qt提供的可以在这里下载:https://code.csdn.net/tujiaw/webengineview/tree/master/qwebchannel.js

运行的时候index.html和qwebchannel.js这两个文件放在与exe同级目录下

  • 5
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
QWebEngineView 可以很方便地与 JavaScript 进行交互。以下是一个简单的示例代码,演示如何从 JavaScript 调用 C++ 函数: ```cpp #include <QApplication> #include <QWebEngineView> #include <QDebug> #include <QWebChannel> #include <QJsonObject> #include <QJsonDocument> // 定义一个用于与 JavaScript 交互的对象 class JsObject : public QObject { Q_OBJECT public slots: void jsFunction(const QString &msg) { qDebug() << "Received message from JavaScript:" << msg; } }; int main(int argc, char *argv[]) { QApplication a(argc, argv); // 创建 QWebEngineView 控件 QWebEngineView view; view.setUrl(QUrl("qrc:/index.html")); view.show(); // 创建 QWebChannel 对象,用于将 C++ 对象暴露给 JavaScript QWebChannel channel; JsObject jsObject; channel.registerObject("myObject", &jsObject); // 注册 QWebChannel 对象到 QWebEngineView 控件中 view.page()->setWebChannel(&channel); return a.exec(); } ``` 在上面的代码中,我们创建了一个名为 `JsObject` 的类,它继承自 QObject,并定义了一个名为 `jsFunction` 的槽函数。当 JavaScript 调用该函数时,它将输出收到的消息。 我们还创建了一个 QWebChannel 对象,并将 `JsObject` 对象注册为 `myObject`。然后,我们将 QWebChannel 对象注册到 QWebEngineView 控件中,以便 JavaScript 可以访问我们注册的 C++ 对象。 接下来,我们需要在 JavaScript 中调用 `jsFunction` 函数。以下是一个简单的 index.html 文件,演示如何调用该函数: ```html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>QWebEngineView Example</title> <script src="qrc:///qtwebchannel/qwebchannel.js"></script> <script> // 在页面加载完成后,连接到 C++ 对象并调用 jsFunction 函数 window.onload = function() { new QWebChannel(qt.webChannelTransport, function(channel) { var myObject = channel.objects.myObject; myObject.jsFunction("Hello from JavaScript!"); }); } </script> </head> <body> <h1>QWebEngineView Example</h1> </body> </html> ``` 在上面的代码中,我们使用 `QWebChannel` 对象中的 `objects` 属性来访问我们在 C++ 中注册的对象 `myObject`。然后,我们调用 `jsFunction` 函数,并将消息传递给它。 当你运行该示例时,它将在控制台中输出消息 "Received message from JavaScript: Hello from JavaScript!",表示 C++ 函数已成功从 JavaScript 调用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值