8

QPainter を使用してアプリケーションの背景を描画するフルサイズの QGLWidget があります (将来的にはネイティブの openGL コマンドに変更される可能性があります)。

この QGLWidget の上で、ユーザー インターフェイス要素に QWidgets (非 GL) を使用します。これらは、たとえば、QLineEdits と QPushButtons です。それらを、半透明の背景ペイントを使用するカスタム ペイントされた QWidget に入れました。QLineEdit と QPushButton の paintEvents は上書きされ、半透明の背景も使用されます。

UI 全体は次のようになります(これは、OpenGL を無効にして、背景に QGLWidget の代わりに QWidget を使用したスクリーンショットです。(独自の領域内に) 影も描画する半透明の上部バーに注意してください):

スクリーンショット

QLineEdit にフォーカスがある場合、不透明度は高くなりますが、完全には不透明ではありません。

スクリーンショット

したがって、OpenGL を有効にすると (背景は QGLWidget になります)、上記の半透明のウィジェットは背景の上ではなく、初期化されていないデータ (と思われる) の上に描画されます。トップバーを通して輝く画像は、ウィンドウ全体である場合もあれば、現在デスクトップにある他のウィンドウである場合もあります。

これは現在、次のようになっています(このスクリーンショットでは、半透明のペイント操作がペイントされているデータは、オフセットを持つウィジェット自体のイメージのようです)。

スクリーンショット

行編集にテキストを書き込んだとき (ここでは、「これは以前にあったテキストです!」)、それを削除し、フォーカスを背景ウィジェットに戻します (拡大鏡アイコンとプレースホルダー テキストが表示されます)。ペイントされたものはまだ透けて見えます (目に見える境界線はもう見えないはずですが、それでも透けて見えることに注意してください) :

スクリーンショット

したがって、問題は次のとおりです。基礎となるウィジェットの上にペイントされる代わりに、半透明のウィジェットが古い結果の上にペイントされ、最初は「初期化されていないメモリ」のようなものです。

なぜこれが起こるのですか?どうすれば問題を解決できますか?

回答する前に知っておくべきこと:

  • バックグラウンド シーンは、オフスクリーンでレンダリングされるタイルの構成です。そのため、非常に高速にペイントでき、オーバーレイの小さな変更ごとに背景を再ペイントしても問題ありません。
  • 上部のバーは、含まれている 2 つのウィジェット (ボタンと行の編集) を手動でペイントして配置したカスタム QWidget です。
  • 2 つのウィジェットは paintEvent を上書きし、フォーカスがある場合にのみ独自の (半透明の) 背景を描画し、Qt によって既に提供されているフレームを使用しません。したがって、2 番目のスクリーンショットの白い境界線は、カスタム paintEvent で描画されます。
  • 背景とオーバーレイ ウィジェットの構成を個別に実装できるようにしたい。背景は、AbstractMapViewいくつかの具体的なマップ ビュー クラスを持つ です。ウィンドウ全体はAbstractView(複数の具象ビューもあります) であり、具象マップ ビューとオーバーレイ ウィジェットの両方が含まれており、それ自体が決定する方法で構成されています。そのため、オーバーレイ ウィジェットのロジックを基になるマップ ビューの一部にしたくありません。(少し複雑なので、これを理解していただければ幸いです。)
4

2 に答える 2

3

これは、GL コンテンツ (つまり、バックグラウンド、別名 QGLWidget) が Qt コンテキストにない場合の問題のように思えます。私は Qt を使用した GL ペイントのプロではありませんが、方向性や潜在的なヒントについては、GL ペイントと QLabel に関するこのディスカッションを参照してください。

http://www.qtcentre.org/threads/40335-QLabel-on-top-of-a-QGLWidget-background-issue

要するに、ここオフィスでは OpenGL ペイントとマップのオフスクリーン レンダリングを使用しており、フォアグラウンド ウィジェットの背景に半透明を適用できるように、Qt がピクセルを認識していることを確認することが非常に重要です。

私たちが使用する特定の製品は、マップをタイルでレンダリングし、バッファーでの GL 出力の提供をサポートします (つまり、スナップショットと呼ばれ、ビットマップとして提供されます)。その時点で、通常の QWidget の paintEvent を使用してバッファーをペイントします。ペイントされたピクセルは Qt コンテキストにあります。

于 2012-07-23T02:13:11.060 に答える