Есть ли способ использовать 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
но (в моем случае) это наконец сработало!