私は現在、線を作成して作成後に変更できる小さなベクター描画プログラムを開発しています (これらの線はカスタム QGraphicsItem に基づいています)。たとえば、下の図は、線の左端 (黄色でマーク) の点を画面の右側にドラッグするとどうなるかを示しており、効果的に線が長くなります。
ポイントをゆっくり動かすとすべて正常に動作しますが、急速に動かすといくつかの視覚的なアーティファクトが表示されます。
再描画を呼び出すために使用しているコード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)
ことですが、それは醜い (そして遅い) ものです。