2014-10-28 82 views
2

我目前正在開發一個小矢量繪圖程序,您可以創建線條並在創建後修改它們(這些線條基於自定義QGraphicsItem)。例如,下面的圖片顯示時最左邊的(標記爲黃色)線的點被拖拽到屏幕的右側,有效的延長線會發生什麼:修改自定義QGraphicsItem時顯示的工件

Figure1

一切工作正常時,點緩慢地移動,然而,當快速地移動,一些視覺假象出現:

enter image description here

該件的我使用要求進行重繪位於mouseMoveEvent重定義的方法,其中包含的以下各行的代碼代碼:

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

有我的boundingRect定義顯然是沒有問題的,因爲在paint方法添加painter->drawRect(boundingRect())表明這一點:

enter image description here

,也有當線路簡單移動(標誌QGraphicsItem::ItemIsMovable沒問題被設置),甚至很快。

有沒有人知道這裏發生了什麼?我的猜測是update沒有被立即調用,因此mouseMoveEvent可以重新調用前多次調用,也許取消以前的調用?我不確定。

當然,簡單的修復方法是將QGraphicsView對象的視口模式設置爲QGraphicsView::FullViewportUpdate),但這很醜陋(而且很慢)。

回答

1

沒有看到你如何更新線條的全部功能,我猜你已經省略了在更新項目的邊界矩形之前調用prepareGeometryChange()

隨着文檔狀態: -

準備幾何變化的項目。 在更改項目的邊界矩形之前調用此函數以保持QGraphicsScene的索引保持最新。

+1

那解決了這個問題,謝謝! – thomasc 2014-10-29 18:50:32