• 8701阅读
  • 5回复

关于Qt中图形与图像融合叠加显示的问题 [复制链接]

上一主题 下一主题
离线chaosgrass
 

只看楼主 倒序阅读 楼主  发表于: 2013-07-23
关键词: QWindowQPAQWidget

使用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获取绘制结果?




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


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

离线rozendew

只看该作者 1楼 发表于: 2013-07-23
说实话,没看懂你想表达什么。。。不过个人理解,你这个很像 Qt 自带的 Demo :boxes ,有没有参照过呢。
我只是知道我所知道的
离线chaosgrass

只看该作者 2楼 发表于: 2013-07-25
引用第1楼rozendew于2013-07-23 14:17发表的  :
说实话,没看懂你想表达什么。。。不过个人理解,你这个很像 Qt 自带的 Demo :boxes ,有没有参照过呢。



没看懂也给了很好的建议,呵呵,多谢了,我先研究研究boxes


基本需求就是在高帧率动态图像上显示用户可控制得透明图形,主要是需要性能保证,性能要在下面的约束下满足图像实时帧率性能与上层图形的用户交互性能:
1. 下层动态视频保持一定的帧率(30帧左右),一定的大小(或许能达到1280*1024);
2. 上层图形可能包括多个(数十个)矩形窗口(类似QWidget)或其它异形窗口(类似QGraphicsItem);


我目前已经找对了方向,用QGraphicsProxyWidget能够初步实现,能达到一定的帧率(800*500分辨率下达到100Frame/s),但不知道如何使用硬件加速,设了setViewport(new QGLWidget))之后帧率反而下降,也不知道上层图形数量多了之后会怎样,呵呵,能否再给些建议呢?

离线blueskit

只看该作者 3楼 发表于: 2013-07-26
有没有考虑使用 SDL ?
离线彩阳

只看该作者 4楼 发表于: 2013-07-27
硬件加速所指的应该是你用OpenGL显示的视频了。

除非对OpenGL相关代码使用高版本的OpenGL API(基于OpenGL 2以上),否则似乎没有办法提高什么性能。
上海Qt开发联盟,热忱地欢迎你的加入!
离线lch922

只看该作者 5楼 发表于: 2015-01-28
不知楼主有没有解决。
1、如果设备支持多个frambuffer的话,可以用两个frambffer,视频和GUI分别使用不同的frambuffer,由硬件实现叠加。
2、可以参考Gstreamer sdk里面有例子怎样使用Qt播放视频,改造一下就可以了。
给我一片天空,还你一道彩虹。
快速回复
限100 字节
 
上一个 下一个