Есть ли способ использовать QtWebEngine без OpenGL?

Я пытаюсь запустить QtWebEngine на виртуальной машине и испытываю трудности. Согласно ответу на этот вопрос:

В конце концов я понял, что OpenGL 3.3 не будет легко работать на виртуальных машинах... пока. Мне пришлось загружаться с Ubuntu USB и работать оттуда, установив последний пакет mesa 3d.

Есть ли способ заставить QtWebEngine работать без OpenGL? Я не использую напрямую вызовы OpenGL и не нуждаюсь в каких-либо трехмерных возможностях. Я просто хочу вставить QWebEngineView для отображения динамических страниц HTML. Я предполагаю, что это должно быть возможно, так как Chrome работает на той же виртуальной машине без проблем.

2 ответа

Решение

Я не думаю, что есть способ использовать Qt WebEngine без OpenGL, Это не очень ясно сказано в документации, но вот что я понял из того, что нашел.

О Хроме

Как здесь сказано, QtWebEngine интегрирует быстродействующие веб-возможности Chromium в Qt. Плюс, это Chromium, который позволяет манипулировать OpenGL через граф сцены Qt Quick ( источник):

Chromium тесно интегрирован с графом сцены Qt Quick, который основан на OpenGL ES 2.0 или OpenGL 2.0 для его рендеринга. Это предоставляет вам однопроходную компоновку веб-контента и весь Qt Quick UI. Интеграция в Chromium прозрачна для разработчиков, которые просто работают с Qt и JavaScript.

Также сказано, что и процесс рендеринга, и процесс GUI должны совместно использовать контекст OpenGL:

Поскольку процесс рендеринга отделен от процесса графического интерфейса, в идеале они должны совместно использовать контекст OpenGL, чтобы один процесс мог получить доступ к ресурсам, загруженным другим, таким как изображения или текстуры.

О самом Qt WebEngine

Мы только что говорили о графическом интерфейсе Qt: фактически Qt WebEngine не зависит от этого графического интерфейса (рендеринг страницы и выполнение JavaScript отделены от процесса графического интерфейса в процесс Qt WebEngine), но помните, что если вы хотите, чтобы ваше приложение работало, вам нужно будет использовать контекст OpenGL между обоими процессами. В частности, это достигается по умолчанию с помощью QSurfaceFormat, который имеет OpenGLContextProfile доступный функцией QSurfaceFormat:: profile (). Теперь мы оглянемся на заметки по платформе Qt WebEngine, в которых говорится:

Если необходимо установить новый QSurfaceFormat по умолчанию с измененным профилем OpenGL, его следует установить до объявления экземпляра приложения, чтобы убедиться, что все созданные контексты OpenGL используют один и тот же профиль OpenGL.

В OS X, если QSurfaceFormat по умолчанию установлен после экземпляра приложения, приложение завершит работу с qFatal () и напечатает сообщение о том, что QSurfaceFormat по умолчанию должен быть установлен перед экземпляром приложения.

Если мы посмотрим на исходный код Qt, вызовы OpenGL сделаны в нескольких важных файлах, таких как qtwebengine\src\core\web_engine_context.cpp или же qtwebengine\src\webengine\api\qtwebengineglobal.cpp, Кроме того, я также нашел звонки OpenGL в функциях из источников в qtwebengine\src\3rdparty\chromium\, так что я подозреваю, что Chromium иногда нужно вызывать функции OpenGL.

Короче

Qt WebEngine использует Chromium (который не обязательно использует OpenGL), а также графический интерфейс Qt, который использует OpenGL контекст, который должен использоваться веб-движком. Таким образом, я пришел к выводу, что вы не можете использовать Qt WebEngine без OpenGL.

У меня была такая же проблема в моей среде виртуальной машины, когда я пытался запустить приложение, использующее QtWebEngine, и оно разбилось.

Я добавлю этот ответ в качестве справки - хотя Сергей Хасанов уже упоминал об этом в комментарии выше.

Используйте программное обеспечение Qt Quick2DRenderer - см. Https://doc.qt.io/QtQuick2DRenderer/

Для этого просто установите переменную окружения:

      export QMLSCENE_DEVICE=softwarecontext

затем перезапустите приложение. Он все еще может жаловаться на

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

но (в моем случае) это наконец сработало!

Другие вопросы по тегам