Окно X из потока OpenGL (glx) в Qt
Я делаю плотную потоковую передачу текстур (несколько потоков живого видео) с OpenGL, используя объекты Puffer Pixel (используя QtOpenGL/QGLWidget здесь не вариант) в Linux.
Поток текстур выполняется отдельным, настраиваемым модулем cpp OpenGL и потоком (полностью отделенным от библиотек Qt)
Тем не менее, я хочу транслироваться в x окон, которые управляются подсистемой Qt (т.е. видео появляется в виджетах)
У меня есть два варианта:
Создайте виджет qt, получите идентификатор окна x для виджета и передайте его в мой пользовательский модуль OpenGL.
Qt => window_id => пользовательский модуль OpenGL
В пользовательском модуле OpenGL я затем использую этот window_id с glxMakeCurrent в качестве цели рендеринга.
Создайте окно x в моем модуле OpenGL. Передайте идентификатор окна x в модуль Qt, то есть:
пользовательский модуль OpenGL => window_id => Qt
Это "здоровее", потому что я могу создать собственное окно x, имеющее правильные параметры, соответствующие конфигурациям кадрового буфера glx, то есть: glx framebuffer config => visual => colormap => параметры для создания окна X
Затем "чужое" окно может использоваться в Qt следующим образом (в PyQt):
q_window =QtGui.QWindow.fromWinId(win_id) q_widget =QtWidgets.QWidget.createWindowContainer(q_window,parent=parent)
Оба варианта работают в принципе, но..
В (1) через несколько часов система x-window начинает задыхаться.. окна не реагируют и т. Д. Очень странно. Я подозреваю какое-то переполнение сигналов в системе x-window (и, следовательно, в цикле событий qt) ..?
Вариант (2) не страдает от этой проблемы, но, конечно, я потеряю все взаимодействие с окном..! то есть, нет способа получить события щелчка мышью, drag'n'drop и т. д. из пользовательского "q_widget" (см. выше)
Итак, вопросы:
- В варианте (1), кажется, что-то нездоровое... Я не уверен, что это такое, поскольку он довольно глубоко входит в систему X Window. Любое понимание этого?
- Как получить события щелчка мыши и т. Д. Из "чужого" окна в подсистему Qt?