[讨论]关于Qt下图形与图像的叠加显示方案
-
使用Qt开发的一个项目,涉及到需要将图形与图像融合显示,需要将显示分层:
- 上层显示图形窗口与控件(Qt GUI),下层显示30帧/秒的动态图像视频(OpenGL);
- GUI绘制透明色处,显示下层视频图像;
- Qt GUI需要响应用户交互(鼠标、键盘、焦点)。
感觉这应用开发中是个常见需求,我尝试过几种方案:
-
QGLWidget控件内嵌QWidget控件
--结果:失败,OpenGL内部无法绘制QWidget -
通过QGraphicsView::setViewport(new QGLWidget),在QGLWidget中绘制动态视频图像,在QGraphicsView中绘制图形;
--这种方案对需求有一定限制,在图像范围内只显示QGraphicsItem,不显示通用控件
--结果:失败,当QGLWidget设置为QGraphicsView的Viewport后,上面的OpenGL动画无法显示; -
看了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获取绘制结果? -
Qt5.0下提供了每个平台的平台插件,可重新实现windows平台下的QPlatformIntegration插件,拦截QWindowsBackingStore::flush,实现与动态视频混合,但这样也有问题:
--问题1:图形与图像需要实现两个窗口,图形需要出现假窗口(当绘制的画布),实际图形与图像叠加融合后绘制到OpenGL窗口上(在QPlatformIntegration层次上识别窗口似乎有点不太合适);
--问题2:如何实现用户交互?用户实际看到的是图像图像叠加后的OpenGL窗口,能够操作的也只有这个窗口,如何将OpenGL窗口上的操作正确重定向给图形窗口? -
能否还有其他方案?恳请各位专家不吝赐教。
-
!http://doc.qt.digia.com/qq/qq26-openglwidgets2.png(叠加后的效果)!
刚刚在QQ26上找到"一篇文章":http://doc.qt.digia.com/qq/qq26-openglcanvas.html,这是我所希望的实现效果,但我希望透明叠加能做到对每个QWidget对象透明,最好能够只在QWidget树的根节点进行处理,感觉既然存在native Widget,应当能够做到在顶层窗口改变所有子Widget的绘制目标吧?
-
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