[提问]关于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获取绘制结果?
4. Qt5.0下提供了每个平台的平台插件,可重新实现windows平台下的QPlatformIntegration插件,拦截QWindowsBackingStore::flush,实现与动态视频混合,但这样也有问题:
--问题1:图形与图像需要实现两个窗口,图形需要出现假窗口(当绘制的画布),实际图形与图像叠加融合后绘制到OpenGL窗口上(在QPlatformIntegration层次上识别窗口似乎有点不太合适);
--问题2:如何实现用户交互?用户实际看到的是图像图像叠加后的OpenGL窗口,能够操作的也只有这个窗口,如何将OpenGL窗口上的操作正确重定向给图形窗口?
5. 能否还有其他方案?恳请各位专家不吝赐教。