gpt4 book ai didi

javascript - 从 Javascript 端调用 Qt 函数(QWebView)

转载 作者:IT老高 更新时间:2023-10-28 22:37:08 25 4
gpt4 key购买 nike

我有一个可以将任何 HTML 页面加载到 Web View 中的 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 中加载的 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 绑定(bind)到 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>

关于javascript - 从 Javascript 端调用 Qt 函数(QWebView),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19469295/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com