我正在使用 QWebEnginePage 类来呈现我的网页。我需要实现回调函数。所以首先我想在 JS 中注册我的插槽,并在需要时从 JS 调用这个插槽(例如,在网页上单击按钮之后)。我试着做 there ,但这不是我需要的,因为它只说明从 Qt 调用 JS 函数并接收结果,但我需要回调。是否可以实现?
在早期版本的 Qt 中有一个模块 qtwebkit,我的目标可以像描述的那样实现 there使用 addToJavaScriptWindowObject 方法。但是如何使用没有这种甚至类似方法的 qtwebenginewidgets 模块来做到这一点呢?
最佳答案
在QWebEngine你可以使用 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();
});
请注意,您必须包含 qwebchannel.js在 HTML 端
关于javascript - 从 JavaScript 调用 Qt 槽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48982793/