繁体   English   中英

从Javascript端调用Qt函数(QWebView)

[英]Calling a Qt function from the Javascript side (QWebView)

我有一个Qt项目,可以将任何HTML页面加载到Web视图中。 我在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加载的Javascript(在QWebView加载)从C ++端调用一个函数。

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

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

我想从Javascript方面调用它:

someMethod("sumOfNumber", 12, 23);

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

我怎样才能做到这一点?

您需要在继承自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方面我可以在我的QObject上调用任何槽或Q_INVOKABLE方法,只需通过上面提供的名称引用它(在这种情况下为“somefoo”):

somefoo.doSomething();

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

更新 - 添加原始示例。

main.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"

index.html的:

<html>
    <body>
        <script type="text/javascript">
            myoperations.sumOfNumbers(12, 23);
        </script>
    </body>
</html>

目前接受的答案已经过时,因为Qt转移到了WebEngine

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM