从Javascript端(QWebView)调用Qt函数

15

我有一个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(在QWebView中加载)中加载的Javascript从C++端调用一个函数。

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

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

我希望您能从Javascript端调用它:
someMethod("sumOfNumber", 12, 23);

如何在控制台中输出 35 (12 + 23)?

我该怎么做?


可能是在QWebView中从JavaScript调用C++函数是否可行?的重复问题。 - BartoszKP
是的,看起来是重复的。 - László Papp
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

更新 - 添加原始示例。

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>

有人能告诉我 main.moc 是什么吗?为什么要包含它,以及 "main.moc" 的内容是什么? - Parth Doshi
@ParthDoshi moc是Qt使用的元对象编译器系统,用于将C++中的Qt特定代码(Qt需要的非标准C++代码)转换为常规C++代码,以便常规C++编译器能够理解。通常情况下,您不需要与moc文件交互或查看它们。 - johnbakers
1
@ksimons,我在你的代码中遇到了:-1: error: symbol(s) not found for architecture x86_64:-1: error: linker command failed with exit code 1 (use -v to see invocation)的错误。有什么解决办法吗? - Niklas
@Niklas 你重新运行了qmake吗?也许可以发布你的项目文件? - ksimons

5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接