Ion*_*zău 14 javascript c++ qt
我有一个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();
}
Run Code Online (Sandbox Code Playgroud)
这工作正常,但我想通过加载的Javascript file.html(加载QWebView)从C++端调用一个函数.
因此,具有以下C++函数:
void sumOfNumbers (a, b)
{
qDebug() << a + b;
}
Run Code Online (Sandbox Code Playgroud)
我想从Javascript方面调用它:
someMethod("sumOfNumber", 12, 23);
Run Code Online (Sandbox Code Playgroud)
将在控制台中打印35(12 + 23).
我怎样才能做到这一点?
ksi*_*ons 15
您需要在继承自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);
Run Code Online (Sandbox Code Playgroud)
然后从javascript方面我可以在我的QObject上调用任何槽或Q_INVOKABLE方法,只需通过上面提供的名称引用它(在这种情况下为"somefoo"):
somefoo.doSomething();
Run Code Online (Sandbox Code Playgroud)
更多信息: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"
Run Code Online (Sandbox Code Playgroud)
index.html的:
<html>
<body>
<script type="text/javascript">
myoperations.sumOfNumbers(12, 23);
</script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)