3

私は現在、線を作成して作成後に変更できる小さなベクター描画プログラムを開発しています (これらの線はカスタム QGraphicsItem に基づいています)。たとえば、下の図は、線の左端 (黄色でマーク) の点を画面の右側にドラッグするとどうなるかを示しており、効果的に線が長くなります。

図1

ポイントをゆっくり動かすとすべて正常に動作しますが、急速に動かすといくつかの視覚的なアーティファクトが表示されます。

ここに画像の説明を入力

再描画を呼び出すために使用しているコードmouseMoveEventは、次のコード行を保持する再定義されたメソッドにあります。

QRectF br = boundingRect();
x2 = static_cast<int>(event->scenePos().x()-x());
y2 = static_cast<int>(event->scenePos().y()-y());
update(br);

メソッドにboundingRect追加すると次のようになるため、私の定義にはpainter->drawRect(boundingRect())明らかに問題はありません。paint

ここに画像の説明を入力

QGraphicsItem::ItemIsMovableまた、単純に行を移動する (フラグを立てる) 場合も、急激に移動しても問題ありません。

ここで何が起こっているか知っている人はいますか?私の推測では、updateすぐに呼び出されていないためmouseMoveEvent、再描画が発生する前に複数回呼び出すことができます。おそらく以前の呼び出しをキャンセルしますか? わからない。

もちろん、簡単な修正はQGraphicsView、ラインを保持しているオブジェクトのビューポート モードを に設定するQGraphicsView::FullViewportUpdate)ことですが、それは醜い (そして遅い) ものです。

4

1 に答える 1

2

ラインをどのように更新しているかについての完全な機能を見なければ、アイテムの境界矩形を更新する前にprepareGeometryChange()の呼び出しを省略したと思います。

ドキュメントの状態: -

形状変更のためにアイテムを準備します。QGraphicsScene のインデックスを最新の状態に保つために、アイテムの境界矩形を変更する前にこの関数を呼び出します。

于 2014-10-29T09:16:37.770 に答える