从OpenGL(glx)线程到Qt

时间:2018-02-19 18:19:32

标签: qt opengl pyqt xlib glx

我在Linux中使用像素puffer对象(使用QtOpenGL / QGLWidget不是一个选项)使用OpenGL进行重纹理流(多个实时视频流)。

纹理流由单独的自定义OpenGL cpp模块和线程完成(完全与Qt库分开)

但是,我想要流入由Qt子系统操作的x窗口(即视频出现在窗口小部件中)

我有两个选择:

  1. 创建一个qt小部件,获取小部件的x窗口ID并将其传递给我的自定义OpenGL模块

    Qt => window_id =>自定义OpenGL模块

    在自定义OpenGL模块中,我使用window_id和glxMakeCurrent作为渲染目标。

  2. 在我的自定义OpenGL模块中创建一个x窗口。将x窗口的id传递给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)
    
  3. 这两个选项原则上都有效,但是......

    在(1)中,几个小时后,x-window系统开始窒息..窗口没有响应等等。非常奇怪。我怀疑x-window系统中的某些信号溢出(因此,在qt事件循环中)..?

    选项(2)不会遇到这个问题,但当然,我会松开所有窗口的交互..!即,没有办法从自定义“q_widget”(见上文)中获取鼠标点击事件,拖拽等等。

    所以,问题是:

    • 在选项(1)中,似乎有些不健康的东西......我不确定它是什么,因为它深入X窗口系统。对此有何见解?
    • 如何将“外部”窗口中的鼠标点击等事件发送到Qt子系统?

0 个答案:

没有答案