Внеэкранный рендеринг с QOffscreenSurface с использованием Docker - PullRequest
0 голосов
/ 04 марта 2020

Я использую Qt5 для рендеринга вне экрана и у меня ошибка сегментации при работе внутри Docker.

У меня есть код внутри c++ и вызов функции через python с использованием pybind11

. Этот код вызывает ошибку segfault

QSurfaceFormat glFormat;
glFormat.setVersion(3, 3);
glFormat.setProfile(QSurfaceFormat::CoreProfile);
glFormat.setRenderableType(QSurfaceFormat::OpenGL);

surface = new QOffscreenSurface();
surface->setFormat(glFormat);
surface->create(); // <-- Here 

. точная ошибка:

QObject::connect: Cannot connect (null)::destroyed(QObject*) to QOffscreenSurface::screenDestroyed(QObject*) 

Я пытался запустить его через xvfb-run -a python prg.py и получил ту же ошибку

Есть ли какие-либо указатели для отладки этого?

Немного больше контекста этой проблемы, приведенный выше код работает нормально, если я использую его в основном потоке, заключенном в QApplication. Эта проблема возникает только тогда, когда я перемещаю ее внутри функции, чтобы я мог вызвать ее внутри python.

1 Ответ

0 голосов
/ 04 марта 2020

Ваша последняя подсказка о работе вне основного потока - это, вероятно, проблема, с которой вы столкнулись.

Просмотр документов https://doc.qt.io/qt-5/qoffscreensurface.html#details:

Примечание: из-за того, что QOffscreenSurface поддерживается QWindow на некоторых платформах, кроссплатформенные приложения должны гарантировать, что create () вызывается только в основном (GUI) потоке. Тогда QOffscreenSurface безопасно использовать с makeCurrent () в других потоках, но инициализация и уничтожение всегда должны происходить в главном (GUI) потоке.

Поэтому решение, вероятно, заключалось бы в создайте поверхность в главном потоке, а затем просто используйте ее так, как вам нужно, через pybind11.

...