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