代码之家  ›  专栏  ›  技术社区  ›  Reunanen

Qt MDI应用程序与OpenGL:如何获取有效的屏幕截图?

  •  5
  • Reunanen  · 技术社区  · 15 年前

    我有一个 MDI 应用程序以qt编写。一些子窗口包括 QGLWidget 即OpenGL上下文。其中最突出的是使用OpenGL顶点和片段着色器来可视化数据。

    我需要以编程方式捕获应用程序主窗口的屏幕截图,当然包括所有碰巧可见的子窗口。一开始听起来很简单(“肯定被问过很多次,所以我们就用谷歌搜索一下吧!”)但仔细看后,似乎有点棘手…

    以下是我迄今为止所做的尝试:

    1. QPixmap::grabWidget 显然,因为重定向上下文似乎不支持必需的OpenGL扩展,所以对于使用着色程序的子窗口不起作用。(呈现代码检查关联的上下文是否支持所需的扩展,如果不支持,则拒绝继续。)
    2. QPixmap::grabWindow 静默地将所有OpenGL上下文留空——甚至那些只使用基本原语的上下文。
    3. QGLWidget::grabFrameBuffer 有效,但只捕获特定子窗口的OpenGL上下文,而我想获取整个应用程序(本质上是 Alt+PrtScr 在Windows中)。

    我还尝试先执行2,然后为所有子窗口迭代3,只需将3的结果复制到2图像的正确位置。这非常有效,直到我做了一些子窗口重叠——在这种情况下,来自3的图像覆盖子窗口帧等。因此,这种方法可能需要更多的代码来处理所有令人讨厌的角落情况……

    一些额外的背景:一旦我得到屏幕截图,我将把其中的几个放到一个场景中,以便创建一个视频——可能使用 ffmpeg . 这使这个问题成为(第一部分)的一种延续。 my previous question ;只是应用程序已经从一个单独的上下文独立的OpenGL程序发展到使用qt作为整个窗口和UI小部件的程序,并将图形嵌入到子窗口中。

    虽然我当然更喜欢一个不错的Qt-ish跨平台解决方案,但我也愿意考虑使用特定于Windows的黑客。(如我所见,这应该是可能的) ALT+PRTSCR 做得非常正确。)

    有什么建议吗?

    3 回复  |  直到 15 年前
        1
  •  2
  •   genpfault    15 年前

    非常黑客,但是捕捉桌面(不隐藏窗口)就像 this tutorial 除了你的窗户,什么都剪了?

    更一般地说,我甚至不确定OpenGL规范要求输出必须放在前缓冲区:一个实现可以只使用视频覆盖(或Voodoo2-esque VGA-pass-through-shenanigans)进行输出。

        2
  •  1
  •   Caleb Huitt - cjhuitt    15 年前

    我现在唯一能想到的就是执行以下psuedocode:

     for each window
         grab the window into its own pixmap
         grab the GL portions and paste into the windows
     order the window pixmaps by depth of the window (deepest first)
     initialize a common pixmap
     for each window pixmap
         paint the window pixmap into the common pixmap at the appropriate location.