10

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

この種の処理の推奨される方法は、OpenGL シーンを描画した後に 2D コンテンツをオーバーペイントすることです。リンクされた例は、単純な形状を描いている限り、非常に簡単に見えます。代わりに、いくつかの子QWidgetオブジェクトの描画を延期して、QGLWidget.

だから、私の問題はこれに要約されます:

  1. オーバーレイQWidgetが通常の 2D コンテキストで描画されないようにします。
  2. のペイント イベント ハンドラでQGLWidget、背景を構成する 3D シーンをペイントした後、オーバーレイをペイントします。

このリストの 2 番目の項目は単純に思えます:の paint イベントQWidget::render()内で使用QGLWidgetして、ビューポートの上に目的のウィジェットを描画できます。これはうまくいきます。

最初の項目はよりトリッキーです。イベントの通常の過程でウィジェットがペイントされないようにし、QGLWidgetのペイント ハンドラーでのみペイントする方法が必要です。これを行う明白な方法の 1 つは、 を使用してオーバーレイを非表示にすることですQWidget::hide()。これにより、OpenGL シーンの上にウィジェットを好きなようにペイントできます。ただし、ウィジェットは非表示になっているため、マウスまたはキーボードのイベントには応答しません。例として、QToolBarいくつかのボタンがある を使用しており、ツールバーは適切に描画されていますが、機能していません (どのボタンもクリックに反応しません)。したがって、このパスをたどると、ウィジェットが隠されていてもイベントに応答するように強制する方法が必要になるようです。

私が試したもう 1 つの方法はQToolBar、イベント フィルターを使用して のペイント イベントを傍受し、ツールバー自体がペイントされないようにすることです。ただし、ツールバーは引き続きレンダリングされます。これは、親のペイント イベントをインターセプトしたとしても、ツールバーのさまざまなボタンがまだペイントされている子ウィジェットであるためであると想定しています。

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

4

1 に答える 1