私は小さな GUI インターフェイスを構築しており、ディレクトリから画像をピックスマップとして設定することで画像を描画する QLabel を持っています。ユーザーがこのピックスマップ上のポイントをインタラクティブにクリックし、クリックした場所に小さな緑色の「x」が表示されるようにしたいと考えています。paintEvent メソッドを再実装しようとしましたが、これは私が望む機能ではありません。paintEvent は、QLabel にペイントする理由があるたびに呼び出されるものです...一方、基本描画 (画像) をそのままにして、既に描画された画像の上にポイントを配置するだけです。最終的には、サードパーティの追跡アルゴリズムを使用して、ユーザーが一連の画像を通じてこれらのポイントをインタラクティブに追跡できるようにしたいと考えています。したがって、ユーザーがポイントを移動したり、ポイントを削除したり、ポイントを追加したりできる機能が必要です。それらの背後にある画像を再描画する必要なく、それらを変更します。単純な点の描画に関するオンライン チュートリアルがいくつかありますが、それらはすべて、paintEvent メソッドを再実装してから、mouseEvent を paintEvent に接続する必要があります。私はこれを特に避けようとしています。助言がありますか?
1 に答える
paintEvent()
実際にはオーバーライドを使用したいと考えています。画像の上だけに描画したい場合でも、画像の上に描画されているものを削除または移動した場合、ウィジェットは画像の一部を再描画できる必要があり、これはpaintEvent()
. レンダリングに何かを追加したい場合は、それも行う必要があります。
と考えてpaintEvent()
くださいdraw-the-entire-part-of-the-widget-that's-visible-Event()
。のサブクラスを使用している場合はQLabel
、オーバーライドを呼び出しQLabel::paintEvent(e)
てから、独自のものを呼び出す必要があります。
ポイントのリストを維持しているように聞こえるので、paintEvent()
必要な方法ですべてのポイントを描画する必要があります。
マウス イベントは、ポイントのリストに対して何らかの処理 (ポイントの追加やポイントの移動など) を実行してから、呼び出しupdate()
をトリガーpaintEvent()
して、背景画像と更新されたポイントでウィジェット全体を再描画する呼び出しを行う必要があります。paintEvent()
内部でマウスイベントを追跡または処理しようとして、マウスイベントを接続したり、いじったりしてはいけませんpaintEvent()
。
覚えておくべき主なことは、マウス イベントによって「モデル」が変更され、モデルが変更paintEvent()
されるたびにモデル全体が描画されることです。新しいものや変更されたものを描くだけでよい抽象化/機能があったとしても、その裏では、多くのものを消去して再描画する必要があります。
これは、渡されたイベント オブジェクトのリージョン情報を利用することで最適化できますpaintEvent()
が、通常は必要ありません。
私が提供した別の質問への回答で、多少似た例を見ることができますが、既に見た他の例とそれほど変わらないかもしれません. 残念ながらPythonにはありません。
すべてのレンダリングをメモリ内イメージに実行してから、ラベルが表示されているイメージを更新するだけで済みますが、paintEvent()
オーバーライドの方が適切なオプションです。