Qt MDI app con OpenGL: come catturare uno screenshot valida?
-
20-09-2019 - |
Domanda
Ho un MDI applicazione scritta in Qt. Alcune delle sottofinestre includono QGLWidget
s, cioè i contesti OpenGL. Il più saliente di queste utilizzo OpenGL vertex e fragment shader per visualizzare i loro dati.
Ho bisogno di catturare programmazione uno screenshot della finestra principale dell'applicazione, tra cui, naturalmente, tutte le sottofinestre che capita di essere visibile. Sembra facile in un primo momento ( "molte volte sicuramente stato chiesto, quindi cerchiamo di basta google!"), Ma dopo uno sguardo più attento sembra essere sempre un po 'complicato ...
Ora, ecco quello che ho provato finora:
-
QPixmap::grabWidget
non funziona per le sottofinestre che utilizzano programmi shader, a quanto pare perché il contesto di reindirizzamento non sembra supportare le estensioni OpenGL necessari. (Il codice di rendering verifica che il contesto associato supporta le estensioni necessarie, e si rifiuta di continuare se non.) -
QPixmap::grabWindow
lascia in silenzio tutti i contesti OpenGL vuoti - anche quelli che utilizzano solo primitive di base. -
QGLWidget::grabFrameBuffer
funziona, ma coglie solo il contesto OpenGL della sottofinestra specifica , mentre mi piacerebbe afferrare l'intera applicazione (in sostanza quello cheAlt+PrtScr
fa in Windows).
Inoltre ho provato a fare prima # 2 e quindi l'iterazione # 3 per tutte le sottofinestre, semplicemente copiando il risultato di 3 # nella posizione a destra dell'immagine da # 2. Questo ha funzionato molto bene, fino a quando ho fatto alcune sottofinestre si sovrappongono - in questo caso le immagini da 3 # sovrascrivono le cornici sottofinestra, ecc Quindi questo approccio richiederebbe probabilmente molto di più il codice al fine di gestire tutti i casi d'angolo brutto ...
Alcuni retroscena supplementari: Una volta che ho lo screenshot, ho intenzione di mettere alcuni di loro in un seqence al fine di creare un video - probabilmente utilizzando ffmpeg . Ciò rende questa domanda una sorta di continuazione (la prima parte) i miei precedenti questione; è solo che l'applicazione si è evoluto da un unico contesto standalone programma OpenGL a qualcosa che utilizza Qt per la finestratura complessiva e widget di roba UI, e incorpora la grafica in sottofinestre.
Mentre avrei ovviamente preferirei una bella, Qt-ish soluzione cross-platform, io sono disposto a prendere in considerazione il ricorso ad un hack specifico per Windows, anche. (Che dovrebbe essere possibile, come posso vedere Alt+PrtScr
facendo molto la cosa giusta.)
Quindi, qualche suggerimento?
Soluzione
Molto hacker, ma non la cattura del desktop (senza nascondere la finestra) come in questo tutorial e il ritaglio tutto, ma il vostro lavoro finestra?
Più in generale, non sono nemmeno sicuro che la specifica OpenGL richiede che l'uscita deve essere posizionato nel buffer anteriore:. Un'implementazione potrebbe utilizzare sovrapposizioni video (o VGA Voodoo2-esque shenanigans pass-through) per l'uscita
Altri suggerimenti
L'unica cosa che posso pensare di off-mano è quello di fare il seguente psuedocodarlo:
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.
E 'questo un uso ??
Gli esempi Grabber mostra come recuperare il contenuto di un framebuffer OpenGL