Question

Je MDI application écrit en Qt. Certains des sous-fenêtres comprennent QGLWidgets, à savoir, des contextes OpenGL. Le plus marquant de ces utilisation vertex shaders OpenGL et le fragment de visualiser leurs données.

Je dois capturer une capture d'écran de programmation fenêtre principale de l'application, y compris bien sûr tous les sous-fenêtres qui se trouvent être visibles. Cela semble facile au premier abord ( « certainement été demandé à plusieurs reprises, alors allons google juste! »), Mais après un examen plus attentif, il semble avoir un peu délicat ...

Maintenant, voici ce que j'ai essayé jusqu'à présent:

  1. QPixmap::grabWidget ne fonctionne pas pour les sous-fenêtres qui utilisent les shaders, apparemment parce que le contexte de redirection ne semble pas supporter les extensions OpenGL nécessaires. (Le code de rendu vérifie que le contexte associé prend en charge les extensions nécessaires, et refuse de continuer sinon.)
  2. QPixmap::grabWindow laisse en silence tous les contextes OpenGL vides - même ceux qui utilisent primitives de base seulement.
  3. QGLWidget::grabFrameBuffer fonctionne, mais ne capture que le contexte OpenGL de la fenêtre secondaire spécifique , alors que je voudrais saisir toute l'application (essentiellement ce Alt+PrtScr fait dans Windows).

J'ai aussi essayé de faire d'abord # 2 et # 3 itérer puis pour tous les sous-fenêtres, copier seulement le résultat de # 3 dans le bon endroit de l'image de # 2. Cela a fonctionné très bien, jusqu'à ce que je fait quelques sous-fenêtres se chevauchent - dans ce cas, les images de # 3 écrasent les cadres de fenêtre secondaire, etc. Donc, cette approche aurait probablement besoin d'un code beaucoup plus afin de traiter tous les cas de coin coquins ...

Un peu d'histoire supplémentaire: Une fois que je reçois la capture d'écran, je vais mettre plusieurs d'entre eux dans un seqence afin de créer une vidéo - probablement en utilisant ffmpeg . Cela fait de cette question une sorte de continuation à (la première partie) mes question précédente; il est juste que l'application a évolué à partir d'un programme OpenGL standalone unique contexte à quelque chose qui utilise Qt pour l'ensemble fenêtrage et d'autres choses widget UI, et intègre les graphiques dans les sous-fenêtres.

Alors que je préfère bien sûr une belle solution multi-plateforme Qt-ish, je suis prêt à envisager de recourir à un hack spécifique Windows aussi. (Ce qui devrait être possible, comme je peux voir Alt+PrtScr faire très bien la bonne chose.)

Alors, des suggestions?

Était-ce utile?

La solution

Très hackish, mais ne capture le bureau (sans cacher la fenêtre) comme dans cette tutoriel et tout la culture, mais votre travail de fenêtre?

De manière plus générale, je ne suis même pas sûr que les exigences spécification OpenGL que la sortie doit être placé dans la mémoire tampon avant:. Une implémentation pourrait simplement utiliser les superpositions vidéo (ou Voodoo2-esque VGA de manigances pass-through) pour la sortie

Autres conseils

La seule chose que je peux penser à la main est de faire la psuedocode suivante:

 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.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top