2013-10-23 71 views
0

所以, 我在我定義的區域繪製了一個QPolygonF。該區域從QGraphicsView繼承。縮放圖中已繪製的QPolygonF

我想要做的就是讓用戶圍繞QPolygonF的控制點移動,並在創建多邊形後再改變它。我無法找到我如何做到這一點的參考。

由於我畫線關閉並表示多邊形,並且可繪製區域中還有很多東西,清除它並反覆繪製似乎不太合適。

有誰知道我該如何解決這個問題?

謝謝!

回答

1

我有點困惑,爲什麼你描述你的'區域'從QGraphicsView繼承,但後來討論QPolygonF。如果你使用的是QGraphicsView,這意味着你有一個QGraphicsScene,並將使用QGraphicsPolygonItem。

但是,假設QGraphicsView在這裏是不相關的,QPolygonF只是一個繼承自點的向量的類; QVector。

你應該能夠遍歷點,只要你想要的地方移動它們。你可以得到一個點是這樣的: -

QPolygonF poly; // assume it has been given a number of points 
QPointF& point = poly[index]; // where index is the index into the QVector of points 

然後你可以移動了一點: -

point.SetX(xPos); 
point.SetY(yPos); 

重繪項目作爲一個點被移動不應該是一個問題。

+0

是的,這正是我想到的,但因爲我想要鼠標移動來決定多邊形中任何點的移動方式。當鼠標移動時,我不想一次又一次地繪製所有東西。所以我想知道是否有一種方法只繪製一個多邊形(用新的點)去掉了這個多邊形的前一個實例(舊點)而沒有其他東西。 – navderm

+0

通過更新Polygon的點並在其Widget上調用update(),只會重繪部件及其內容。視頻遊戲曾經使用相同的「髒矩形」方法,直到意識到使用後臺緩衝區刷新整個屏幕更快更容易。 Qt也是這樣做的,所以讓Qt通過調用小部件上的更新來處理它。如果您看到重繪問題,那麼您可以查看如何優化代碼。 – TheDarkKnight

0

清除它並重繪整個場景可能是最有效的方法。唯一的其他選擇是嘗試計算多邊形在改變時的最小邊界矩形,並嘗試僅使該區域無效,但實際上它是同樣的事情。 Qt繪圖非常快,尤其是當你利用opengl集成。當我開始擔心重畫整個場景時,我會提醒自己電子遊戲一直在做。 :P

+0

您能否提供我如何使特定區域失效?無論如何,仍然不能解決我必須繪製其他多邊形,因爲我無效的區域也可能包含其他多邊形。 – navderm