2013-06-11 5 views
9

Qtアプリケーション内でOpenGLシーンをレンダリングするQGLWidgetがあります。 QGLWidgetの上にオーバーレイされた他の半透明のQtウィジェットを追加したいと思います。 OpenGLの描画コンテキストはQtのペインタクラスには分かっていないので、標準のウィジェットよりも難しいです。たとえば、明らかなことをして、透明なツールバーをQGLWidgetの上に置くと、ツールバーの透明部分が黒くレンダリングされます(描画時にOpenGLフレームバッファにアクセスできません)。QWidgetがペイントされないようにするにはどうすればいいですか?

このようなことを処理するための推奨方法は、overpaint the 2D content after drawing the OpenGL sceneです。リンクされた例は、単純な図形を描いているかぎり、非常に簡単です。代わりに、私がしたいのは、QGLWidgetのペイントイベントの中で行われるいくつかの子の絵画を延期することです。QWidget

だから、私の問題はこれに沸く:

  1. 防止オーバーレイ通常、2Dコンテキスト内の絵画からQWidget秒。
  2. QGLWidgetのペイントイベントハンドラで、バックグラウンドを構成する3Dシーンをペイントした後にオーバーレイをペイントします。

このリストの2番目の項目は、簡単なことのようです:私は、ビューポートの上に希望のウィジェットを描画するためにQGLWidgetのペイントイベント内QWidget::render()を使用することができます。これはうまく動作します。

最初の項目はもっと難しいです:イベントの通常の過程でウィジェットがペイントされないようにして、QGLWidgetのペイントハンドラでペイントする方法が必要です。これを行う明確な方法の1つは、QWidget::hide()を使用してオーバーレイを非表示にすることです。これは、私が望むように、OpenGLシーンの上にウィジェットをペイントすることを可能にします。しかし、ウィジェットは隠されているため、マウスやキーボードのイベントに応答しません。たとえば、私はQToolBarをいくつかのボタンで使用していますが、ツールバーは適切にペイントされていますが、機能していません(ボタンのどれもクリックに反応しません)。だから、この道を行くなら、たとえそれが隠されていてもウィジェットがイベントに応答するように強制する方法が必要になると思われる。

私が試みたもう1つのアプローチは、ツールバーが自分自身をペイントするのを防ぐ目的で、イベントフィルタを使用してQToolBarのペイントイベントをインターセプトすることです。ただし、ツールバーは引き続きレンダリングされます。これは、ツールバーのさまざまなボタンが、親のペイントイベントを傍受しても、まだ描画されている子ウィジェットであるためと推測しています。

私の目標を達成する方法についてのアイデアはありますか?

答えて

12

私はあなたの問題を完全に理解していませんが、タイトルに記載された質問に答えようとします。イベントフィルタを使用する必要があります。 widget->installEventFilter(object)を使用してイベントフィルタをインストールします。widgetは絵画をブロックするウィジェットです。objectはQObject派生クラスのオブジェクトです。このクラスのeventFilterを再実装:あなたはeventFilterからtrueを返した場合

bool MyClass::eventFilter(QObject* object, QEvent* event) { 
    if (event->type() == QEvent::Paint) { return true; } 
    return false; 
} 

、イベントを濾過し、塗料は発生しません。

widget->setUpdatesEnabled(false)を使用して、一時的に描画を無効にすることもできます。完了したら再度有効にすることを忘れないでください。

関連する問題