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 :
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).QPixmap::grabWindow
deja silenciosamente todos los contextos de OpenGL vacíos, incluso aquellos que solo utilizan primitivas básicas.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 haceAlt+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?
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