找回密码
 立即注册

关于Qt中图形图像叠加显示的问题

发表于 2013-7-23 11:36:31 | 显示全部楼层 |阅读模式
10Qter豆
使用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. 能否还有其他方案?恳请各位专家不吝赐教。


最佳答案

查看完整内容

其实这样的需求,使用图形视图框架还是比较好的。它里面做了优化,图形数量不是问题! 还有一点想说的是,Qt 5 windows版本已经弱化了对opengl的支持,还是选择了ANGLE!
回复

使用道具 举报

发表于 2013-7-23 11:36:32 | 显示全部楼层
chaosgrass 发表于 2013-7-25 11:27
呵呵,终于有人回复了,是你这个意思,半透明能支持当然更好(更美观),但不是必须,主要是需要性能保证 ...


其实这样的需求,使用图形视图框架还是比较好的。它里面做了优化,图形数量不是问题!

还有一点想说的是,Qt 5 windows版本已经弱化了对opengl的支持,还是选择了ANGLE!
回复

使用道具 举报

发表于 2013-7-24 17:56:04 | 显示全部楼层
你的意思是要将动态视频作为背景,显示到半透明的窗口下面吗?
回复

使用道具 举报

 楼主| 发表于 2013-7-25 11:27:08 | 显示全部楼层
yafeilinux 发表于 2013-7-24 17:56
你的意思是要将动态视频作为背景,显示到半透明的窗口下面吗?

呵呵,终于有人回复了,是你这个意思,半透明能支持当然更好(更美观),但不是必须,主要是需要性能保证,性能要在下面的约束下满足图像实时帧率性能与上层图形的用户交互性能:
1. 下层动态视频保持一定的帧率(30帧左右),一定的大小(或许能达到1280*1024);
2. 上层图形可能包括多个矩形窗口(类似QWidget)或其它异形窗口(类似QGraphicsItem);

我现在在QGraphicsView里放入了一个用QGaphicsProxyWidget包裹的窗口里渲染动态图像,需求上能大致满足(上层还能放其他Widget和GraphicsItem),并能达到一定的帧率(800*500分辨率下达到100Frame/s),但不知道上层图形数量多了之后会怎样,呵呵,希望各位高手能给些建议。。。
回复

使用道具 举报

 楼主| 发表于 2013-7-27 00:20:25 | 显示全部楼层
多谢,请问angle是啥呢?
回复

使用道具 举报

发表于 2017-5-19 09:40:51 | 显示全部楼层
我有一个类似的问题,想利用qgraphicsview解决不知道行不行。我想需要将widget的句柄给第三方播放库播放视频,再在视频画面上叠加一层半透明控件,现在利用qt普通图形控件,做不出透明效果,不知道用qgraphicsview 行不行。感觉和楼主问题很像。楼主能给细说一下嘛,如果可以,说下具体怎么实现?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

chaosgrass

    主题

    帖子

    19

    积分

    Qter1级会员

    Rank: 1

    积分
    19

Qter1级会员

发私信

Qt开源社区——开源 共享 自由

微信扫一扫
查看精品教程!