不像
Qt WebKit Bridge
,我找不到使用JS side
在Qt WebChannel
上使用同步函数调用。
有什么办法吗?
我觉得没办法。文档中说:QWebChannel
注意 HTML 客户端和 QML/C++ 之间的所有通信 服务器是异步的。
此外,在这篇博客中正是这样说的:Bridge the gap between C++/QML and the web
但是,与WebKit Bridge相反,WebChannel提供的API 是完全异步的。
希望有帮助。
这不是一个同步的 QWebChannel 调用,但我找到了一种完全不使用 QWebChannel 就能实现所需功能的方法。
创建继承自 QWebEnginePage 的自定义类“MyWebEnginePage”。
按以下方式重载 javaScriptPrompt(...) 方法:
bool MyWebEnginePage::javaScriptPrompt(const QUrl &securityOrigin, const QString &msg, const QString &defaultValue, QString *result) {
if (msg.length() > 1 && msg[0] == '^') {
return processCommand(msg, defaultValue, result);
}
return QWebEnginePage::javaScriptPrompt(securityOrigin, msg, defaultValue, result);
}
添加新方法 bool processCommand(QString param1, QString param2, QString* result):
bool MyWebEnginePage::processCommand(const QString& param1, const QString& param2, QString* result) {
// parse param1 and/or param2 to determine what to do and get arguments
char cmd = param1[1].toLatin1();
if (cmd == '0') {
// do something or call some method in c++
QMessageBox::about(0, QString("Test"), QString("It works: ") + param2);
}
else if (cmd == '1') {
// do something or call some method in c++ and return a string
// the returned string can be encoded JSON object or base64 string
*result = QString("some string to return: ") + param2;
return true;
}
return false;
}
将您的 MyWebEnginePage 分配给 QWebEngineView:
view->setPage(new MyWebEnginePage());
在 JavaScript 中创建以下对象:
bridge = {
doSomething: function (param) {
window.prompt('^0', param);
},
doSomethingAndReturn: function (param) {
// if you have more arguments encode them into a single string
return window.prompt('^1', param);
}
};
现在您可以通过以下方式从 JavaScript 与 c++ 同步通信:
bridge.doSomething('input1');
var returned_string = bridge.doSomethingAndReturn('input2');
console.log(returned_string);
window.prompt 的原始功能仍然有效,但您不能在消息开头使用“^”符号。
缺点是如果要传递更多的参数,必须先将它们全部编码成字符串(例如JSON格式),然后在c++中解码。返回值可以在 JavaScript 桥对象中以相同的方式进行编码和解码。
你也可以重载 javaScriptConfirm 方法,但这只能返回布尔值。