Qtアプリケーション内でOpenGLシーンをレンダリングするQGLWidget
があります。 QGLWidget
の上にオーバーレイされた他の半透明のQtウィジェットを追加したいと思います。 OpenGLの描画コンテキストはQtのペインタクラスには分かっていないので、標準のウィジェットよりも難しいです。たとえば、明らかなことをして、透明なツールバーをQGLWidget
の上に置くと、ツールバーの透明部分が黒くレンダリングされます(描画時にOpenGLフレームバッファにアクセスできません)。QWidgetがペイントされないようにするにはどうすればいいですか?
このようなことを処理するための推奨方法は、overpaint the 2D content after drawing the OpenGL sceneです。リンクされた例は、単純な図形を描いているかぎり、非常に簡単です。代わりに、私がしたいのは、QGLWidget
のペイントイベントの中で行われるいくつかの子の絵画を延期することです。QWidget
だから、私の問題はこれに沸く:
- 防止オーバーレイ通常、2Dコンテキスト内の絵画から
QWidget
秒。 QGLWidget
のペイントイベントハンドラで、バックグラウンドを構成する3Dシーンをペイントした後にオーバーレイをペイントします。
このリストの2番目の項目は、簡単なことのようです:私は、ビューポートの上に希望のウィジェットを描画するためにQGLWidget
のペイントイベント内QWidget::render()
を使用することができます。これはうまく動作します。
最初の項目はもっと難しいです:イベントの通常の過程でウィジェットがペイントされないようにして、QGLWidget
のペイントハンドラでペイントする方法が必要です。これを行う明確な方法の1つは、QWidget::hide()
を使用してオーバーレイを非表示にすることです。これは、私が望むように、OpenGLシーンの上にウィジェットをペイントすることを可能にします。しかし、ウィジェットは隠されているため、マウスやキーボードのイベントに応答しません。たとえば、私はQToolBar
をいくつかのボタンで使用していますが、ツールバーは適切にペイントされていますが、機能していません(ボタンのどれもクリックに反応しません)。だから、この道を行くなら、たとえそれが隠されていてもウィジェットがイベントに応答するように強制する方法が必要になると思われる。
私が試みたもう1つのアプローチは、ツールバーが自分自身をペイントするのを防ぐ目的で、イベントフィルタを使用してQToolBar
のペイントイベントをインターセプトすることです。ただし、ツールバーは引き続きレンダリングされます。これは、ツールバーのさまざまなボタンが、親のペイントイベントを傍受しても、まだ描画されている子ウィジェットであるためと推測しています。
私の目標を達成する方法についてのアイデアはありますか?