Pregunta

Tengo una MDI aplicación escrita en Qt. Algunas de las sub-ventanas incluyen QGLWidgets, es decir, contextos OpenGL. La más destacada de estos vértices y sombreadores de fragmentos uso de OpenGL para visualizar sus datos.

Necesito capturar programación una captura de pantalla de la ventana principal de la aplicación, incluyendo, por supuesto, todas las ventanas secundarias que pasan a ser visibles. Suena fácil al principio ( "definitivamente ha pedido muchas veces, así que vamos a Google él!"), Pero después de un vistazo más de cerca que parece ser cada vez un poco complicado ...

Ahora esto es lo que he probado hasta ahora:

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

También he intentado hacer primero # 2 y luego la iteración # 3 para todos los sub-ventanas, sólo copiar el resultado de # 3 en la ubicación correcta de la imagen desde el # 2. Esto funcionó muy bien, hasta que hice algunos sub-ventanas se solapan - en cuyo caso las imágenes de # 3 sobreescriben los marcos de ventana secundaria, etc Por lo tanto este enfoque, probablemente requeriría mucho más código con el fin de manejar todos los casos de esquina desagradables ...

Algunos antecedentes adicionales: Una vez que consiga la captura de pantalla, voy a poner varias de ellas en un seqence con el fin de crear un video - probablemente utilizando ffmpeg . Eso hace que esta pregunta una especie de continuación de (la primera parte) mis pregunta anterior; es sólo que la aplicación ha evolucionado a partir de un único contexto OpenGL programa independiente para algo que utiliza Qt para el conjunto de ventanas y cosas por el widget de la interfaz de usuario, e integra los gráficos en la sub-ventanas.

Mientras que yo, por supuesto, preferiría una solución multiplataforma agradable, Qt-ish, estoy dispuesto a considerar recurrir a un truco específico para Windows, también. (Que debería ser posible, que puedo ver Alt+PrtScr haciendo mucho lo correcto.)

Por lo tanto, alguna sugerencia?

¿Fue útil?

Solución

Muy hacker, pero que captura el escritorio (sin ocultar su ventana) al igual que en este tutorial y recortar todo, pero su trabajo ventana?

De forma más general, ni siquiera estoy seguro de que la especificación OpenGL exige que la producción tiene que ser colocado en el búfer frontal:. Una implementación podría apenas utilizar las capas de vídeo (VGA Voodoo2 o travesuras al estilo de paso a través) para la salida

Otros consejos

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.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top