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 调用的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 函数中执行 QWebEngine

在最新Qt5.4,使用QWebengine,如何js调用Qt

Qt添加QWebEngine模块后打包在无Qt的环境上运行出错的问题

如何在 QWebEngine 中设置 QNetworkCookieJar?

QWebEngine 默认阻碍 github 导航

使用 Qt5 的 QWebEngine