Qt MDI aplicación con OpenGL: cómo tomar una captura de pantalla válida?
-
20-09-2019 - |
Pregunta
Tengo una MDI aplicación escrita en Qt. Algunas de las sub-ventanas incluyen QGLWidget
s, 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:
-
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.) -
QPixmap::grabWindow
deja en silencio todos los contextos OpenGL vacías - incluso los que utilizan primitivas básicas solamente. -
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 haceAlt+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?
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.
Es esta la utilización ??
Los ejemplos Grabber muestra cómo recuperar el contenido de un framebuffer OpenGL