Domanda

Ho un MDI applicazione scritta in Qt. Alcune delle sottofinestre includono QGLWidgets, 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:

  1. 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.)
  2. QPixmap::grabWindow lascia in silenzio tutti i contesti OpenGL vuoti - anche quelli che utilizzano solo primitive di base.
  3. QGLWidget::grabFrameBuffer funziona, ma coglie solo il contesto OpenGL della sottofinestra specifica , mentre mi piacerebbe afferrare l'intera applicazione (in sostanza quello che Alt+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?

È stato utile?

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.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top