从 JavaScript 调用 Qt 插槽
Calling Qt slot from JavaScript
我正在使用 QWebEnginePage class 来呈现我的网页。我需要实现回调函数。所以首先我想在 JS 中注册我的插槽,并在需要时从 JS 调用这个插槽(例如,在网页上单击按钮之后)。我尝试像 there 那样做,但这不是我需要的,因为它说明仅从 Qt 调用 JS 函数并接收结果,但我需要回调。是否可以实施?
在早期版本的 Qt 中有一个模块 qtwebkit,我的目标可以像 there 描述的那样使用 addToJavaScriptWindowObject 方法实现。但是如何使用没有那个甚至类似方法的 qtwebenginewidgets 模块来做到这一点?
在QWebEngine you can use QWebChannel为了和你的JS交流
创建代理对象以从 JS 与 Qt 通信
// This Object will be registered in the web channel
class MyJSObj : public QObject
{
Q_OBJECT
public:
MyJSObj(QObject * poParent = Q_NULLPTR);
Q_INVOKABLE int foo(); // call from JS
};
在你的 cpp 代码中
// Create proxy object
m_poMyJSObj = new MyJSObj(this);
// Create channel
m_poWebView = new QWebEngineView(this);
QWebChannel * poChannel = new QWebChannel();
m_poWebView->page()->setWebChannel(poChannel);
// Register your proxy object
const QString oJSObjectName = "mJSQtObject"; // use in JS to call Qt functions
poChannel->registerObject(oJSObjectName, m_poMyJSObj);
在 JS 中
new QWebChannel(qt.webChannelTransport, function (channel) {
// now you retrieve your object
var JSQtObject = channel.objects.mJSQtObject;
// call Qt function from JS
var qtValue = JSQtObject.foo();
});
请注意,您必须在 HTML 侧添加 qwebchannel.js
我正在使用 QWebEnginePage class 来呈现我的网页。我需要实现回调函数。所以首先我想在 JS 中注册我的插槽,并在需要时从 JS 调用这个插槽(例如,在网页上单击按钮之后)。我尝试像 there 那样做,但这不是我需要的,因为它说明仅从 Qt 调用 JS 函数并接收结果,但我需要回调。是否可以实施?
在早期版本的 Qt 中有一个模块 qtwebkit,我的目标可以像 there 描述的那样使用 addToJavaScriptWindowObject 方法实现。但是如何使用没有那个甚至类似方法的 qtwebenginewidgets 模块来做到这一点?
在QWebEngine you can use QWebChannel为了和你的JS交流
创建代理对象以从 JS 与 Qt 通信
// This Object will be registered in the web channel
class MyJSObj : public QObject
{
Q_OBJECT
public:
MyJSObj(QObject * poParent = Q_NULLPTR);
Q_INVOKABLE int foo(); // call from JS
};
在你的 cpp 代码中
// Create proxy object
m_poMyJSObj = new MyJSObj(this);
// Create channel
m_poWebView = new QWebEngineView(this);
QWebChannel * poChannel = new QWebChannel();
m_poWebView->page()->setWebChannel(poChannel);
// Register your proxy object
const QString oJSObjectName = "mJSQtObject"; // use in JS to call Qt functions
poChannel->registerObject(oJSObjectName, m_poMyJSObj);
在 JS 中
new QWebChannel(qt.webChannelTransport, function (channel) {
// now you retrieve your object
var JSQtObject = channel.objects.mJSQtObject;
// call Qt function from JS
var qtValue = JSQtObject.foo();
});
请注意,您必须在 HTML 侧添加 qwebchannel.js