Frage

Ich habe ein MDI App in Qt geschrieben. Einige der Unterfenster schließen QGLWidgets, das heißt, OpenGL Kontext. Die markantesten dieser Verwendung OpenGL Vertex und Fragment-Shader sichtbar zu machen, ihre Daten.

Ich muss programmatisch einen Screenshot der Hauptfenster der Anwendung erfassen, darunter natürlich alle Unterfenster, die sichtbar sein passieren. Sounds einfach auf den ersten ( „auf jeden Fall viele Male gefragt, also lassen Sie uns Google es einfach!“), Aber nach näherer Betrachtung scheint es ein wenig schwierig zu bekommen ...

Jetzt ist hier, was ich versucht habe, so weit:

  1. QPixmap::grabWidget funktioniert nicht für die Subwindows, dass die Verwendung Shader-Programme, offenbar weil die Umleitung Kontext scheint nicht die notwendigen OpenGL-Erweiterungen zu unterstützen. (Die Rendering-Code überprüft, ob der zugehörige Kontext die erforderlichen Erweiterungen unterstützt, und weigert sich, wenn nicht fortzusetzen.)
  2. QPixmap::grabWindow leise Blätter alle OpenGL-Kontexte leer - auch diejenigen, die Verwendung Grund Primitiven nur.
  3. QGLWidget::grabFrameBuffer funktioniert, aber erfasst nur die OpenGL Kontext der spezifischen Subwindow , während ich möchte die gesamte Anwendung greifen (im wesentlichen, was Alt+PrtScr tut in Windows).

Ich habe auch versucht zuerst # 2 tun und dann # 3 für alle Subwindows Iterieren, kopieren nur das Ergebnis # 3 in die richtige Lage des Bildes von # 2. Das funktionierte sehr gut, bis ich einige Subwindows gemacht überlappen - in diesem Fall die Bilder von # 3 Überschreiben der Subwindow Rahmen usw. Also dieser Ansatz wahrscheinlich erfordern würde viel mehr Code, um alle bösen Ecke Fälle zu behandeln ...

Einige zusätzliche Hintergrund: Sobald ich den Screenshot, ich werde in einem seqence, um einige von ihnen zu setzen, ein Video zu erstellen - wahrscheinlich mit ffmpeg . Das macht diese Frage eine Art Fortsetzung (der erste Teil) meine vorherige Frage ; es ist nur, dass die App von einem Single-Kontext eigenständige OpenGL Programm zu etwas, das Qt für die Gesamt Windowing verwendet und UI-Widget Material entwickelt hat, und bettet die Grafiken in Subwindows.

Während ich natürlich würde eine netten bevorzugen, Qt-ish Cross-Plattform-Lösung, ich bin bereit, auf einen speziellen Windows-Hack zu prüfen, zurückgreifen, auch. (Welche möglich sein sollte, wie ich Alt+PrtScr sehen sehr das Richtige zu tun.)

Also, irgendwelche Vorschläge?

War es hilfreich?

Lösung

Sehr hackish, aber macht die Erfassung der Desktop (ohne Fenster versteckt) wie in diese Tutorial und Zuschneiden alles aber Ihre Fenster Arbeit?

Generell Ich bin nicht einmal sicher, dass die OpenGL-Spezifikation verlangt, dass die Ausgabe im vorderen Puffer platziert werden muss. Eine Implementierung nur Video-Overlays verwenden könnte (oder Voodoo2-esque VGA Pass-Through-Spielereien) für die Ausgabe

Andere Tipps

Das einzige, was ich von Off-Hand denken kann, ist die folgende psuedocode zu tun:

 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.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top