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
(複数の具象ビューもあります) であり、具象マップ ビューとオーバーレイ ウィジェットの両方が含まれており、それ自体が決定する方法で構成されています。そのため、オーバーレイ ウィジェットのロジックを基になるマップ ビューの一部にしたくありません。(少し複雑なので、これを理解していただければ幸いです。)