[讨论]关于Qt下图形与图像的叠加显示方案



  • 使用Qt开发的一个项目,涉及到需要将图形与图像融合显示,需要将显示分层:

    1. 上层显示图形窗口与控件(Qt GUI),下层显示30帧/秒的动态图像视频(OpenGL);
    2. GUI绘制透明色处,显示下层视频图像;
    3. Qt GUI需要响应用户交互(鼠标、键盘、焦点)。

    感觉这应用开发中是个常见需求,我尝试过几种方案:

    1. QGLWidget控件内嵌QWidget控件
      --结果:失败,OpenGL内部无法绘制QWidget

    2. 通过QGraphicsView::setViewport(new QGLWidget),在QGLWidget中绘制动态视频图像,在QGraphicsView中绘制图形;
      --这种方案对需求有一定限制,在图像范围内只显示QGraphicsItem,不显示通用控件
      --结果:失败,当QGLWidget设置为QGraphicsView的Viewport后,上面的OpenGL动画无法显示;

    3. 看了dbzhang800的blog,发现在Qt5.0下,QWindow可以指定QBackingStore,于是想利用QWindow作为QWidget的容器,让QWidget绘制到QWindow上,最后将QBackingStore内容导出:
      --问题1:QWidget不能显式地作为QWindow的子对象,感觉所有alien QWidget都会绘制到一个native QWidget(就是QWindow?),但如何获得这个native QWidget的绘制结果?
      --问题2:发现QWidget有个createWindowContainer函数,只是将QWindow包装成QWidget对象,在Qt窗口树种提供原始显示,但并不能提供在QWindow上的QWidget绘制?
      --问题3:如何获得窗口刷新事件,并从QBackingStore获取绘制结果?

    1. Qt5.0下提供了每个平台的平台插件,可重新实现windows平台下的QPlatformIntegration插件,拦截QWindowsBackingStore::flush,实现与动态视频混合,但这样也有问题:
      --问题1:图形与图像需要实现两个窗口,图形需要出现假窗口(当绘制的画布),实际图形与图像叠加融合后绘制到OpenGL窗口上(在QPlatformIntegration层次上识别窗口似乎有点不太合适);
      --问题2:如何实现用户交互?用户实际看到的是图像图像叠加后的OpenGL窗口,能够操作的也只有这个窗口,如何将OpenGL窗口上的操作正确重定向给图形窗口?

    2. 能否还有其他方案?恳请各位专家不吝赐教。





  • Why not use Qt Quick Controls Qt 5.1 ?



  • [quote author="Vincent007" date="1374589050"]Why not use Qt Quick Controls Qt 5.1 ?[/quote]

    为什么要用Qt Quick Controls, Qt Quick能实现的,Qt C++不应该也能实现吗?我主要担心性能问题。



  • 你现在研究的是我们将要研究的。

    一般来说,通过Demo中的Boxes例子可以基本上满足你所需要的条件,这些对话框都是直接嵌套在窗口中的,而且可以在这个QGraphicsView中对中心立方体进行旋转操作。交互都不是问题。

    第二种方案能够实现,Boxes例子就是第二种方法实现的,只是不是像你这么实现的,详情还是看看它的源代码,这样你可以再试一试第二种方法。

    另外,LZ研究过嵌入式中使用Qt OpenGL和Native控件混合的情况吗?嵌入式中对于OpenGL的支持如何?



  • 你担心性能问题, 就應該比較那個實現方法性能較佳. Qt Quick Controls 理應性能較佳, 因為 Qt Quick Controls 應是用 scene graph rendering 的。你提到的方法沒有一個用到scene graph rendering.



  • [quote author="Vincent007" date="1374758589"]你担心性能问题, 就應該比較那個實現方法性能較佳. Qt Quick Controls 理應性能較佳, 因為 Qt Quick Controls 應是用 scene graph rendering 的。你提到的方法沒有一個用到scene graph rendering.[/quote]

    呵呵,明白,那我用QGraphicsView是不是也能达到同样的性能?



  • 已经使用QGraphicsView进行了尝试,性能还不错,不过目前是用QGraphicsProxyWidget来进行动态图像绘制,换成setViewport( new GLWidget )性能没有改善,反而略有下降。
    我看boxes里是用QGraphicsScene::drawBackground来进行OpenGL绘制,过几天准备用这个方法来试试对性能改善有没有帮助。

    [quote author="jiangcaiyang" date="1374727331"]你现在研究的是我们将要研究的。

    一般来说,通过Demo中的Boxes例子可以基本上满足你所需要的条件,这些对话框都是直接嵌套在窗口中的,而且可以在这个QGraphicsView中对中心立方体进行旋转操作。交互都不是问题。

    第二种方案能够实现,Boxes例子就是第二种方法实现的,只是不是像你这么实现的,详情还是看看它的源代码,这样你可以再试一试第二种方法。

    另外,LZ研究过嵌入式中使用Qt OpenGL和Native控件混合的情况吗?嵌入式中对于OpenGL的支持如何?
    [/quote]



  • [quote author="chaosgrass" date="1375062154"]
    [quote author="Vincent007" date="1374758589"]你担心性能问题, 就應該比較那個實現方法性能較佳. Qt Quick Controls 理應性能較佳, 因為 Qt Quick Controls 應是用 scene graph rendering 的。你提到的方法沒有一個用到scene graph rendering.[/quote]

    呵呵,明白,那我用QGraphicsView是不是也能达到同样的性能?[/quote]

    QGraphicsView 的 rendering 沒有利用 scene graph, 因此 QGraphicsView的性能 應該比Qt Quick Controls 差.



  • [quote author="Vincent007" date="1375105268"]
    [quote author="chaosgrass" date="1375062154"]
    [quote author="Vincent007" date="1374758589"]你担心性能问题, 就應該比較那個實現方法性能較佳. Qt Quick Controls 理應性能較佳, 因為 Qt Quick Controls 應是用 scene graph rendering 的。你提到的方法沒有一個用到scene graph rendering.[/quote]

    呵呵,明白,那我用QGraphicsView是不是也能达到同样的性能?[/quote]

    QGraphicsView 的 rendering 沒有利用 scene graph, 因此 QGraphicsView的性能 應該比Qt Quick Controls 差.
    [/quote]
    我使用QGraphicsView+QGraphicsScene,并且在QGraphicsScene::drawBackground中进行OpenGL绘制,rendering效率会比Qt Quick Controls差吗?



  • 我說了重點是 scene graph. Qt Quick Controls 用 scene graph rendering, QGraphicsScene 不是用 scene graph rendering, 所以 QGraphicsScene rendering效率理應 比Qt Quick Controls差.

    "http://stackoverflow.com/questions/16267404/qt-quick-vs-graphics-view-framework-qgraphicsscene":http://stackoverflow.com/questions/16267404/qt-quick-vs-graphics-view-framework-qgraphicsscene

    "In Qt4, I don't think QML is going to give any peformance advantage, as I think (did not verify now) there it is written on top QGraphicsView stuff."

    "numbers from running the photoviewer demo":http://blog.qt.digia.com/wp-content/uploads/2011/05/numbers.png


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.