2009-08-27 6 views
5

Tengo una aplicación MDI escrita en Qt. Algunas de las subventanas incluyen QGLWidget s, es decir, contextos OpenGL. Los más destacados de estos utilizan los sombreadores de vértices y fragmentos OpenGL para visualizar sus datos.Qt MDI aplicación con OpenGL: cómo obtener una captura de pantalla válida?

Necesito capturar mediante programación una captura de pantalla de la ventana principal de la aplicación, que incluye, por supuesto, todas las subventanas que resultan visibles. Suena fácil al principio ("definitivamente me preguntaron muchas veces, ¡entonces vamos a googlearlo!"), Pero después de una mirada más cercana parece ser un poco complicado ...

Ahora esto es lo que he intentado hasta ahora :

  1. QPixmap::grabWidget no funciona para las sub-ventanas que utilizan programas de sombreado, al parecer porque el contexto redirección no parece apoyar las extensiones OpenGL necesarias. (El código de representación comprueba que el contexto asociado admite las extensiones necesarias y se niega a continuar si no).
  2. QPixmap::grabWindow deja silenciosamente todos los contextos de OpenGL vacíos, incluso aquellos que solo utilizan primitivas básicas.
  3. QGLWidget::grabFrameBuffer funciona, pero solo captura el contexto de OpenGL de la subventana específica, mientras que me gustaría obtener toda la aplicación (esencialmente lo que hace Alt+PrtScr en Windows).

También intenté hacer primero # 2 y luego repetir # 3 para todas las subventanas, simplemente copiando el resultado de # 3 en la ubicación correcta de la imagen desde # 2. Esto funcionó muy bien, hasta que superpuse algunas subventanas, en cuyo caso las imágenes del n. ° 3 sobrescriben los marcos de la subventana, etc. Por lo que este enfoque probablemente requeriría mucho más código para manejar todos los casos de esquina desagradables ...

Algunos antecedentes adicionales: Una vez que obtenga la captura de pantalla, voy a poner varios de ellos en una secuencia para crear un video, probablemente usando ffmpeg. Eso hace que esta pregunta sea una especie de continuación de (la primera parte de) my previous question; es solo que la aplicación ha evolucionado desde un programa independiente de OpenGL de contexto único a algo que usa Qt para los elementos generales de ventana y widget de UI, e incorpora los gráficos en las subventanas.

Aunque, por supuesto, preferiría una buena solución multiplataforma Qt-ish, estoy dispuesto a considerar recurrir a un hack específico de Windows, también. (Que debería ser posible, como puedo ver Alt+PrtScr haciendo mucho lo correcto.)

¿Alguna sugerencia?

Respuesta

2

Muy hackish, pero captura el escritorio (sin ocultar su ventana) como en this tutorial y corta todo excepto su ventana de trabajo?

En términos más generales, ni siquiera estoy seguro de que la especificación OpenGL exija que la salida se coloque en el buffer frontal: una implementación podría usar superposiciones de video (o shenanig VGA Voodoo2-esque) para la salida.

+0

Se hace * * trabajo! Ahora, ¿por qué no podría pensar en esto yo mismo? ...El único inconveniente que veo es que esto es, básicamente, un poco más lento en comparación con agarrar solo la ventana de interés. Esto podría ser relevante, porque en realidad estoy tratando de tomar un video. Pero estoy aceptando la respuesta de todos modos, porque hace exactamente lo que pedí, ¡muchas gracias! – Reunanen

1

Lo único que se me ocurre fuera de la mano es hacer lo siguiente 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. 
+0

Estoy de acuerdo en que esto debería funcionar, por lo tanto, +1. Pero al menos por ahora, voy a tomar el camino flojo :) – Reunanen

Cuestiones relacionadas