QWebEngine:同步执行 runJavascript - QEventLoop 阻止 Javascript 调用
Posted
技术标签:
【中文标题】QWebEngine:同步执行 runJavascript - QEventLoop 阻止 Javascript 调用【英文标题】:QWebEngine: Execute runJavascript synchronously - QEventLoop blocks Javascript calls 【发布时间】:2021-07-16 11:10:03 【问题描述】:使用 Qt 5.15.2 - 同步执行 runjavascript。
问题:
我试过QtWebEngine - synchronously execute JavaScript to read function result 作为一个单独的应用程序,它运行良好,一切都按预期工作。但是在我的eventLoop->exec()项目中,JS函数没有被执行(runJavascript被调用)。
QSharedPointer<QEventLoop> loop = QSharedPointer<QEventLoop>(new QEventLoop());
req.get()->m_pWebEngineView->page()->runJavaScript(req.get()->m_strJSFuncSignature, [loop](const QVariant& val)
if (loop->isRunning())
loop->quit();
);
loop->exec(QEventLoop::AllEvents | QEventLoop::WaitForMoreEvents);
描述:
我们正在创建一个单线程应用程序,它读取 XML 文件并创建 html/Js/Css UI。我正在使用 CSS flex 布局来布局 UI 项。在代码中,我想在 cpp 中同步获取计算的大小和位置。
为了实现与Javascript的同步通信,我使用了QtWebEngine - synchronously execute JavaScript to read function result中提到的本地事件循环技术。应用挂了,Js函数根本没有被调用。
观察:
如果没有 QEventLoop,所有 runjavascript 调用都会在最后一个接一个地成功执行,即在程序中的所有语句都执行完之后。
使用 QEventLoop,所有的 runjavascript 调用都会被调用,但对应的 Js 函数不会被执行。由于未调用 runjavascript 回调,应用程序挂起。
为什么会这样?请帮忙。
【问题讨论】:
【参考方案1】:发现问题。 我在从 JS 调用的 cpp 函数中启动本地 QtEventLoop。 cpp 函数中的本地 QEventLoop 永远不会退出,因为在本地 QEventLoop 中调用的 Js 函数正在等待当前 Js 调用完成。有点僵局。
解决方案: 我将来自 Js 的呼叫排队到 cpp 到全局事件循环。
【讨论】:
以上是关于QWebEngine:同步执行 runJavascript - QEventLoop 阻止 Javascript 调用的主要内容,如果未能解决你的问题,请参考以下文章
在最新Qt5.4,使用QWebengine,如何js调用Qt
Qt添加QWebEngine模块后打包在无Qt的环境上运行出错的问题