【问题标题】:Is there any way to use QtWebEngine without OpenGL?有没有办法在没有 OpenGL 的情况下使用 QtWebEngine?
【发布时间】:2016-01-10 11:26:12
【问题描述】:

我正在尝试让 QtWebEngine 在 VM 上运行,但遇到了困难。根据this question的回答:

最终我意识到 OpenGL 3.3 不能在虚拟机上轻松运行......但。我必须从 ubuntu usb 启动并通过安装最新的 mesa 3d 包从那里工作。

有没有办法让 QtWebEngine 在没有 OpenGL 的情况下工作?我没有直接使用任何 OpenGL 调用,也不需要任何 3d 功能。我只想嵌入一个QWebEngineView 来显示动态 HTML 页面。我猜这应该是可能的,因为 Chrome 可以在同一个虚拟机上正常工作。

【问题讨论】:

    标签: qt opengl build qt5 qtwebengine


    【解决方案1】:

    我认为没有OpenGL 就无法使用Qt WebEngine。文档中没有说得很清楚,但这是我从我发现的内容中理解的。

    关于Chromium

    正如here 所说,QtWebEngine 将 chromium 的快速移动 Web 功能集成到 Qt 中。另外,是 Chromium 允许通过 Qt Quick 场景图 (source) 操作 OpenGL:

    Chromium 与 Qt Quick 场景图紧密集成,这是 基于 OpenGL ES 2.0 或 OpenGL 2.0 进行渲染。这提供了 您可以一次性合成 Web 内容和所有 Qt Quick UI。 与 Chromium 的集成对开发人员来说是透明的,他们只是 使用 Qt 和 JavaScript。

    也有人说渲染进程和 GUI 进程应该共享一个 OpenGL 上下文:

    由于渲染进程与 GUI 进程分离,它们 理想情况下应该共享一个 OpenGL 上下文以使一个进程能够访问 对方上传的资源,比如图片或者纹理。

    关于 Qt WebEngine 本身

    我们刚才讲了Qt的GUI:其实Qt WebEngine是不依赖这个GUI的(页面渲染和JavaScript执行是从GUI进程分离到Qt WebEngine进程中的),但是请记住,如果你想要你的应用程序要工作,您需要在两个进程之间共享一个 OpenGL 上下文。特别是,默认情况下这是通过QSurfaceFormat 实现的,OpenGLContextProfile 可通过函数QSurfaceFormat::profile() 访问。现在,我们回顾一下Qt WebEngine platform notes,其中指出:

    如果具有修改的 OpenGL 配置文件的新默认 QSurfaceFormat 必须 被设置,它应该在应用程序实例被声明之前被设置, 确保所有创建的 OpenGL 上下文使用相同的 OpenGL 个人资料。

    在 OS X 上,如果在应用程序之后设置了默认 QSurfaceFormat 例如,应用程序将使用 qFatal() 退出,并打印一条消息 应该在应用程序之前设置默认的 QSurfaceFormat 实例。

    如果我们查看 Qt 的源代码,对 OpenGL 的调用是在几个重要文件中进行的,例如 qtwebengine\src\core\web_engine_context.cppqtwebengine\src\webengine\api\qtwebengineglobal.cpp。而且我还在qtwebengine\src\3rdparty\chromium\的源码中发现函数调用OpenGL,所以我怀疑Chromium有时需要调用OpenGL函数。

    总之

    Qt WebEngine 使用 Chromium(不一定使用 OpenGL)和 Qt GUI,它使用必须由 Web 引擎共享的 OpenGL 上下文。因此,我的结论是你不能在没有 OpenGL 的情况下使用 Qt WebEngine。

    【讨论】:

    • 但是qtwebengine可以使用软件渲染器(见here),所以它可以在VM上工作。
    【解决方案2】:

    我在尝试启动使用 QtWebEngine 的应用程序时在我的 VM 环境中遇到了同样的问题,但它崩溃了。

    我将添加这个答案作为参考 - 尽管 Sergey Khasanov 在上面的评论中已经提到过

    使用软件 Qt Quick2DRenderer - 见https://doc.qt.io/QtQuick2DRenderer/

    为此,只需设置环境变量:

    export QMLSCENE_DEVICE=softwarecontext
    

    然后重新启动您的应用程序。它可能还在抱怨

    libEGL warning: GLX/DRI2 is not supported
    libEGL warning: DRI2: failed to authenticate
    

    但是(就我而言)它终于奏效了!

    【讨论】:

      猜你喜欢
      • 2016-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      • 2018-11-10
      相关资源
      最近更新 更多