我有一个
MDI
应用程序以qt编写。一些子窗口包括
QGLWidget
即OpenGL上下文。其中最突出的是使用OpenGL顶点和片段着色器来可视化数据。
我需要以编程方式捕获应用程序主窗口的屏幕截图,当然包括所有碰巧可见的子窗口。一开始听起来很简单(“肯定被问过很多次,所以我们就用谷歌搜索一下吧!”)但仔细看后,似乎有点棘手…
以下是我迄今为止所做的尝试:
-
QPixmap::grabWidget
显然,因为重定向上下文似乎不支持必需的OpenGL扩展,所以对于使用着色程序的子窗口不起作用。(呈现代码检查关联的上下文是否支持所需的扩展,如果不支持,则拒绝继续。)
-
QPixmap::grabWindow
静默地将所有OpenGL上下文留空——甚至那些只使用基本原语的上下文。
-
QGLWidget::grabFrameBuffer
有效,但只捕获特定子窗口的OpenGL上下文,而我想获取整个应用程序(本质上是
Alt+PrtScr
在Windows中)。
我还尝试先执行2,然后为所有子窗口迭代3,只需将3的结果复制到2图像的正确位置。这非常有效,直到我做了一些子窗口重叠——在这种情况下,来自3的图像覆盖子窗口帧等。因此,这种方法可能需要更多的代码来处理所有令人讨厌的角落情况……
一些额外的背景:一旦我得到屏幕截图,我将把其中的几个放到一个场景中,以便创建一个视频——可能使用
ffmpeg
. 这使这个问题成为(第一部分)的一种延续。
my previous question
;只是应用程序已经从一个单独的上下文独立的OpenGL程序发展到使用qt作为整个窗口和UI小部件的程序,并将图形嵌入到子窗口中。
虽然我当然更喜欢一个不错的Qt-ish跨平台解决方案,但我也愿意考虑使用特定于Windows的黑客。(如我所见,这应该是可能的)
ALT+PRTSCR
做得非常正确。)
有什么建议吗?