5

我正在尝试让 QtWebEngine 在 VM 上运行并且遇到了困难。根据这个问题的答案:

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

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

4

2 回答 2

4

我认为没有办法使用 Qt WebEngine 没有OpenGL. 文档中没有很明确地说明,但这是我从我发现的内容中理解的。

关于

正如这里所说,QtWebEngine 将 chromium 的快速移动 Web 功能集成到 Qt 中。另外,是 Chromium 允许通过 Qt Quick 场景图(来源)操作 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 平台说明,其中指出:

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

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

如果我们查看 Qt 的源代码,OpenGL会在几个重要文件中调用 ,例如qtwebengine\src\core\web_engine_context.cppqtwebengine\src\webengine\api\qtwebengineglobal.cpp. 此外,我还OpenGL从 in 的源代码中找到了对 in 函数的调用qtwebengine\src\3rdparty\chromium\,因此我怀疑 Chromium 有时需要调用 OpenGL 函数。

简而言之

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

于 2016-05-30T15:19:46.107 回答
0

我在尝试启动使用 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

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

于 2021-10-28T14:06:14.247 回答