繁体   English   中英

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

[英]Qt MDI app with OpenGL: how to grab a valid screenshot?

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

我需要以编程方式捕获应用程序主窗口的屏幕截图,当然包括碰巧可见的所有子窗口。 起初听起来很容易(“肯定已被多次询问过,所以我们只是谷歌吧!”),但经过仔细研究后看起来似乎有点棘手......

现在这是我到目前为止所尝试的:

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

我还尝试先做#2,然后对所有子窗口迭代#3,只需将#3的结果复制到#2的图像的正确位置。 这非常有效,直到我使一些子窗口重叠 - 在这种情况下,来自#3的图像覆盖子窗口框架等等。所以这种方法可能需要更多的代码才能处理所有令人讨厌的角落情况......

一些额外的背景:一旦我得到截图,我将把它们中的几个放在seqence中以创建视频 - 可能使用ffmpeg 这使得这个问题成为我上一个问题 (前一部分)的延续; 只是该应用程序已从单一上下文独立OpenGL程序演变为使用Qt进行整体窗口和UI窗口小部件的东西,并将图形嵌入子窗口。

虽然我当然更喜欢一个不错的Qt-ish跨平台解决方案,但我也愿意考虑采用特定于Windows的黑客攻击。 (这应该是可能的,因为我可以看到Alt+PrtScr做了非常正确的事情。)

那么,有什么建议吗?

非常hackish,但是捕获桌面(没有隐藏你的窗口)就像在本教程中一样,除了你的窗口工作之外还要裁剪一切?

更一般地说,我甚至不确定OpenGL规范要求输出必须放在前端缓冲区中:实现可以只使用视频覆盖(或Voodoo2-esque VGA直通欺骗)来输出。

我唯一能想到的就是做以下的伪代码:

 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.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM