我在Qt中写了一个MDI应用。一些子窗口包括QGLWidget
s,即OpenGL上下文。其中最突出的是使用OpenGL顶点和片段着色器来可视化其数据。
我需要以编程方式捕获应用程序主窗口的屏幕截图,当然包括碰巧可见的所有子窗口。起初听起来很容易(“肯定已被多次询问过,所以我们只是谷歌吧!”),但经过仔细研究后看起来似乎有点棘手......
现在这是我到目前为止所尝试的内容:
QPixmap::grabWidget
不适用于使用着色器程序的子窗口,显然是因为重定向上下文似乎不支持必要的OpenGL扩展。 (呈现代码检查关联的上下文是否支持所需的扩展,如果没有,则拒绝继续。)QPixmap::grabWindow
默默地将所有OpenGL上下文留空 - 即使只使用基本原语的那些。QGLWidget::grabFrameBuffer
有效,但只捕获特定子窗口的OpenGL上下文,而我想抓取整个应用程序(基本上是Alt+PrtScr
在Windows中的作用)。我还尝试先做#2,然后对所有子窗口迭代#3,只需将#3的结果复制到#2的图像的正确位置。这非常有效,直到我做了一些子窗口重叠 - 在这种情况下,来自#3的图像覆盖子窗口框架等等。所以这种方法可能需要更多的代码才能处理所有令人讨厌的角落情况... < / p>
一些额外的背景:一旦我获得截图,我将把它们中的几个放在一个序列中以创建一个视频 - 可能使用ffmpeg。这使得这个问题成为my previous question的第一部分的延续;只是该应用程序已从单一上下文独立OpenGL程序演变为使用Qt进行整体窗口和UI窗口小部件的东西,并将图形嵌入子窗口。
虽然我当然更喜欢一个不错的Qt-ish跨平台解决方案,但我也愿意考虑采用特定于Windows的黑客攻击。 (这应该是可能的,因为我可以看到Alt+PrtScr
做了非常正确的事。)
那么,有什么建议吗?
答案 0 :(得分:2)
非常hackish,但是在this tutorial中抓取桌面(不隐藏窗口)并裁剪除窗口之外的所有东西?
更一般地说,我甚至不确定OpenGL规范要求输出必须放在前端缓冲区中:实现可以只使用视频覆盖(或Voodoo2-esque VGA直通欺骗)来输出。 / p>
答案 1 :(得分:1)
我唯一可以想到的是做以下的伪代码:
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.
答案 2 :(得分:0)