Qt MDI App mit OpenGL: wie einen gültigen Screenshot machen?
-
20-09-2019 - |
Frage
Ich habe ein MDI App in Qt geschrieben. Einige der Unterfenster schließen QGLWidget
s, 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:
-
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.) -
QPixmap::grabWindow
leise Blätter alle OpenGL-Kontexte leer - auch diejenigen, die Verwendung Grund Primitiven nur. -
QGLWidget::grabFrameBuffer
funktioniert, aber erfasst nur die OpenGL Kontext der spezifischen Subwindow , während ich möchte die gesamte Anwendung greifen (im wesentlichen, wasAlt+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?
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.
Ist das eine Verwendung ??
Die Beispiele zeigen Grabber, wie der Inhalt eines OpenGL abzurufen Framebuffer