我正试图让QtWebEngine在VM上运行,并且遇到了困难。根据这个问题的答案:
最终我意识到OpenGL 3.3在虚拟机上不容易工作。然而。我必须从ubuntu usb启动并安装最新的mesa 3d包。
有没有办法让QtWebEngine工作没有OpenGL?我不直接使用任何OpenGL调用,也不需要任何3d功能。我只是想嵌入一个QWebEngineView
来显示动态HTML页面。我猜这应该是可能的,因为Chrome可以在相同的VM上工作而没有问题。
我不认为有一种方法使用Qt WebEngine没有OpenGL
。文档中没有明确说明,但以下是我从我的发现中所理解的。
正如这里所说的,QtWebEngine将chromium的快速移动web功能集成到Qt中,另外,正是chromium允许通过Qt快速场景图(来源)操作OpenGL:
Chromium与Qt Quick场景图紧密集成,这是基于OpenGL ES 2.0或OpenGL 2.0进行渲染。这提供了您与web内容和所有Qt快速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平台的注释,上面写着:
如果一个新的默认QSurfaceFormat与修改的OpenGL配置文件必须应该在声明应用实例之前设置。确保所有创建的OpenGL上下文使用相同的OpenGL概要。
在OS X上,如果在应用程序之后设置了默认的QSurfaceFormat实例时,应用程序将使用qFatal()退出,并打印一条消息默认的QSurfaceFormat应该在应用程序之前设置实例。
如果我们看一下Qt的源代码,对OpenGL
的调用是在几个重要的文件中进行的,比如qtwebenginesrccoreweb_engine_context.cpp
或qtwebenginesrcwebengineapiqtwebengineglobal.cpp
。此外,我还从qtwebenginesrc3rdpartychromium
的源代码中发现了对OpenGL
的函数调用,因此我怀疑Chromium有时需要调用OpenGL函数。
Qt WebEngine正在使用Chromium(不一定使用OpenGL)和Qt GUI,它使用OpenGL
上下文,必须由Web引擎共享。因此,我的结论是,你不能使用Qt WebEngine没有OpenGL。
我在我的虚拟机环境中有同样的问题,试图启动一个使用QtWebEngine的应用程序,它崩溃了。
我将添加这个答案作为参考-尽管Sergey Khasanov已经在上面的评论中提到了它
使用软件QtQuick2DRenderer -参见https://doc.qt.io/QtQuick2DRenderer/
要做到这一点,只需设置环境变量:export QMLSCENE_DEVICE=softwarecontext
然后重新启动应用程序。它可能仍然会抱怨
libEGL warning: GLX/DRI2 is not supported
libEGL warning: DRI2: failed to authenticate
但是(在我的情况下)它最终工作!