Qtで書かれたMDIアプリがあります。一部のサブウィンドウにはQGLWidget
、OpenGLコンテキストなどが含まれます。これらの中で最も顕著なものは、OpenGL頂点シェーダーとフラグメントシェーダーを使用してデータを視覚化します。
アプリケーションのメインウィンドウのスクリーンショットをプログラムでキャプチャする必要があります。もちろん、たまたま表示されているすべてのサブウィンドウも含まれます。最初は簡単に聞こえますが(「間違いなく何度も尋ねられるので、ググってみましょう!」)、よく見ると少し注意が必要です...
これが私がこれまでに試したことです:
QPixmap::grabWidget
シェーダープログラムを使用するサブウィンドウでは機能しません。これは、リダイレクトコンテキストが必要なOpenGL拡張機能をサポートしていないように見えるためです。(レンダリングコードは、関連付けられたコンテキストが必要な拡張機能をサポートしていることを確認し、サポートしていない場合は続行を拒否します。)QPixmap::grabWindow
基本的なプリミティブのみを使用するものも含め、すべてのOpenGLコンテキストをサイレントに空のままにします。QGLWidget::grabFrameBuffer
Alt+PrtScr
動作しますが、特定のサブウィンドウのOpenGLコンテキストのみをキャプチャしますが、アプリケーション全体(基本的にはWindowsで何が行われるか)を取得したいと思います。
また、最初に#2を実行してから、すべてのサブウィンドウに対して#3を繰り返し、#3の結果を#2から画像の正しい場所にコピーしてみました。これは、いくつかのサブウィンドウをオーバーラップさせるまでは非常にうまく機能しました。その場合、#3の画像がサブウィンドウのフレームなどを上書きします。したがって、このアプローチでは、厄介なコーナーケースをすべて処理するために、おそらくはるかに多くのコードが必要になります...
いくつかの追加の背景:スクリーンショットを取得したら、ビデオを作成するためにそれらのいくつかをシーケンスに入れます-おそらくffmpegを使用します。そのため、この質問は私の前の質問(の最初の部分)の一種の続きになります。アプリがシングルコンテキストのスタンドアロンOpenGLプログラムから、ウィンドウやUIウィジェット全体にQtを使用し、サブウィンドウにグラフィックを埋め込むものに進化しただけです。
もちろん、Qt風のクロスプラットフォームソリューションを好む一方で、Windows固有のハックに頼ることも検討したいと思います。Alt+PrtScr
(私は非常に正しいことをしていることがわかるので、これは可能であるはずです。)
それで、何か提案はありますか?