15

我有一个可以将任何 HTML 页面加载到 Web 视图中的 Qt 项目。我在文件中有以下代码main.cpp

#include "mainwindow.h"
#include <QApplication>
#include <QWebView>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QWebView *view = new QWebView();

    view->resize(400, 500);
    view->load(QUrl("file:///absolute/path/to/my/html/file.html"));
    view->show();

    return app.exec();
}

这工作正常,但我想通过加载file.html(加载QWebView)的 Javascript 从 C++ 端调用一个函数。

因此,具有以下 C++ 函数:

void sumOfNumbers (a, b)
{
   qDebug() << a + b;
}

我想从 Javascript 端调用它:

someMethod("sumOfNumber", 12, 23);

这将在控制台35(12 + 23)中打印。

我怎样才能做到这一点?

4

2 回答 2

16

您需要在继承自 QObject 的类中定义要调用的方法。

从 QWebView,您可以调用page()以检索其 QWebPage。使用 QWebPage,您可以调用mainFrame()以检索其 QWebFrame。QWebFrame 有一个addToJavaScriptWindowObject()方法可以让你将 QObject 绑定到 web 上下文中:

class MyObject {
public slots:
    void doSomething();
};

MyObject *foo = new MyObject;
myWebView->page()->mainFrame()->addJavaScriptToWindowObject("somefoo", foo);

然后从javascript方面,我可以通过上面提供的名称(在本例中为“somefoo”)引用它来调用我的QObject上的任何插槽或Q_INVOKABLE方法:

somefoo.doSomething();

更多信息在这里:http: //qt-project.org/doc/qt-5.1/qtwebkit/qwebframe.html#addToJavaScriptWindowObject

更新- 添加原始示例。

主.cpp:

#include <QApplication>
#include <QDebug>
#include <QWebFrame>
#include <QWebPage>
#include <QWebView>

class MyJavaScriptOperations : public QObject {
    Q_OBJECT
public:
    Q_INVOKABLE void sumOfNumbers(int a, int b) {
        qDebug() << a + b;
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QWebView *view = new QWebView();
    view->resize(400, 500);
    view->page()->mainFrame()->addToJavaScriptWindowObject("myoperations", new MyJavaScriptOperations);
    view->load(QUrl("file:///path/to/my/index.html"));
    view->show();

    return a.exec();
}

#include "main.moc"

索引.html:

<html>
    <body>
        <script type="text/javascript">
            myoperations.sumOfNumbers(12, 23);
        </script>
    </body>
</html>
于 2013-10-19T18:24:09.527 回答
5

当前接受的答案已过时,因为Qt 移至WebEngine.

对于WebEngineView从 JS 调用 Qt 的解决方案是使用Qt WebChannel API

于 2017-11-30T15:26:11.970 回答