Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. Chinese
  4. [讨论]关于Qt下图形与图像的叠加显示方案
Forum Updated to NodeBB v4.3 + New Features

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

Scheduled Pinned Locked Moved Chinese
11 Posts 3 Posters 16.8k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • C Offline
    C Offline
    chaosgrass
    wrote on last edited by
    #1

    使用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. 能否还有其他方案?恳请各位专家不吝赐教。

    1 Reply Last reply
    0
    • C Offline
      C Offline
      chaosgrass
      wrote on last edited by
      #2

      !http://doc.qt.digia.com/qq/qq26-openglwidgets2.png(叠加后的效果)!

      刚刚在QQ26上找到"一篇文章":http://doc.qt.digia.com/qq/qq26-openglcanvas.html,这是我所希望的实现效果,但我希望透明叠加能做到对每个QWidget对象透明,最好能够只在QWidget树的根节点进行处理,感觉既然存在native Widget,应当能够做到在顶层窗口改变所有子Widget的绘制目标吧?

      1 Reply Last reply
      0
      • V Offline
        V Offline
        Vincent007
        wrote on last edited by
        #3

        Why not use Qt Quick Controls Qt 5.1 ?

        1 Reply Last reply
        0
        • C Offline
          C Offline
          chaosgrass
          wrote on last edited by
          #4

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

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

          1 Reply Last reply
          0
          • J Offline
            J Offline
            jiangcaiyang
            wrote on last edited by
            #5

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

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

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

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

            1 Reply Last reply
            0
            • V Offline
              V Offline
              Vincent007
              wrote on last edited by
              #6

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

              1 Reply Last reply
              0
              • C Offline
                C Offline
                chaosgrass
                wrote on last edited by
                #7

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

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

                1 Reply Last reply
                0
                • C Offline
                  C Offline
                  chaosgrass
                  wrote on last edited by
                  #8

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

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

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

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

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

                  1 Reply Last reply
                  0
                  • V Offline
                    V Offline
                    Vincent007
                    wrote on last edited by
                    #9

                    [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 差.

                    1 Reply Last reply
                    0
                    • C Offline
                      C Offline
                      chaosgrass
                      wrote on last edited by
                      #10

                      [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差吗?

                      1 Reply Last reply
                      0
                      • V Offline
                        V Offline
                        Vincent007
                        wrote on last edited by
                        #11

                        我說了重點是 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

                        1 Reply Last reply
                        0

                        • Login

                        • Login or register to search.
                        • First post
                          Last post
                        0
                        • Categories
                        • Recent
                        • Tags
                        • Popular
                        • Users
                        • Groups
                        • Search
                        • Get Qt Extensions
                        • Unsolved