【问题标题】:QWebEngine: Execute runJavascript synchronously - QEventLoop blocks Javascript callsQWebEngine:同步执行 runJavascript - QEventLoop 阻止 Javascript 调用
【发布时间】: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 回调,应用程序挂起。

为什么会这样?请帮忙。

【问题讨论】:

    标签: qt qwebview qwebengineview qwebengine


    【解决方案1】:

    发现问题。 我在从 JS 调用的 cpp 函数中启动本地 QtEventLoop。 cpp 函数中的本地 QEventLoop 永远不会退出,因为在本地 QEventLoop 中调用的 Js 函数正在等待当前 Js 调用完成。有点僵局。

    解决方案: 我将来自 Js 的呼叫排队到 cpp 到全局事件循环。

    【讨论】:

      猜你喜欢
      • 2016-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-30
      • 2020-12-15
      • 2018-08-27
      • 2012-04-18
      • 2017-05-07
      相关资源
      最近更新 更多