Qt MDI应用程序与OpenGL:如何抓取有效的屏幕截图?
我有一个用Qt编写的应用程序。一些子窗口包括Qt MDI应用程序与OpenGL:如何抓取有效的屏幕截图?,qt,opengl,screenshot,mdi,shader,Qt,Opengl,Screenshot,Mdi,Shader,我有一个用Qt编写的应用程序。一些子窗口包括QGLWidgets,即OpenGL上下文。其中最突出的是使用OpenGL顶点和片段着色器来可视化其数据 我需要以编程方式捕获应用程序主窗口的屏幕截图,当然包括所有碰巧可见的子窗口。一开始听起来很简单(“肯定被问了很多次,所以让我们用谷歌搜索一下吧!”),但仔细观察之后,似乎有点棘手 现在我已经试过了: 不适用于使用着色器程序的子窗口,显然是因为重定向上下文似乎不支持必要的OpenGL扩展。(呈现代码检查关联的上下文是否支持所需的扩展,如果不支持,则拒
QGLWidget
s,即OpenGL上下文。其中最突出的是使用OpenGL顶点和片段着色器来可视化其数据
我需要以编程方式捕获应用程序主窗口的屏幕截图,当然包括所有碰巧可见的子窗口。一开始听起来很简单(“肯定被问了很多次,所以让我们用谷歌搜索一下吧!”),但仔细观察之后,似乎有点棘手
现在我已经试过了:
Alt+PrtScr
所做的)Alt+PrtScr
做了非常正确的事情。)
那么,有什么建议吗?非常粗糙,但是像这样捕获桌面(不隐藏窗口)并裁剪除窗口以外的所有内容是否有效 更一般地说,我甚至不确定OpenGL规范是否要求输出必须放在前缓冲区:一个实现可以只使用视频叠加(或伏都教式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.
它确实有用!为什么我自己不能想到这个呢。。。我看到的唯一缺点是,与只抓住感兴趣的窗口相比,这基本上要慢一些。这可能是相关的,因为我实际上是想抓拍一段视频。但我还是接受了答案,因为它完全符合我的要求——非常感谢!它使用grabFrameBuffer(),因此仅捕获OpenGL视口。见问题中的第#3项。我同意这应该有效,因此+1。但至少现在,我要走懒惰的道路:)