2011-06-11 57 views
3

這與我的其他問題之一有關。關於QGraphicsView中圖像拼貼的問題

如果我通過創建一個單獨的QGraphicsItem(以柵格數據作爲其像素圖)來平鋪大圖像,那麼如何跟蹤QGraphicsItem在場景中的位置?顯然對於柵格數據來說,保持所有瓷磚「接觸」以形成連續的圖像非常重要,而且它們也必須位於正確的位置,以便圖像看起來不會混亂。

是否每個瓷磚都必須具有定位方法,以將其移動到相對於其上的頂部/左側/底部/右側的鄰居?這看起來很笨重。有沒有更好的方法讓他們一起移動?換句話說,如果我用滾動條平移場景,或者拾取圖像並在場景中拖動/移動它,我希望所有的圖塊也相對於彼此移動並保持在正確的位置上。

什麼是控制佈局的最佳方法,哪些瓷磚需要渲染(即只有可見的),並且只在需要時才填充數據?此外,一旦圖塊已經被渲染,它的數據是否曾經丟失過,並從圖像文件中重新填充,例如,如果它暫時停留在視圖之外,那麼如果有人轉向該部分,那麼以後會再次出現?

回答

1

有(超過)這樣做的2種方式:

  1. 使用QGraphicsItemGroup這 處理您的瓷磚項目 你的分組。它移動,選擇,更新 它是組成員,就好像它們是 之一。我從來沒有使用它,但從 文檔,它似乎與典型的 應用程序。

  2. 自己在 paint()中畫一個自定義項目。這 讓你完全控制如何 地點和繪製瓷磚,而 項目真正作爲一個項目,因爲它是 ,以及一個項目。這是我 做的。

+0

我希望你能回答,搞清楚你曾經做過這樣的事情。如果我要重寫已定製的QGraphicsItem的paint()方法,你能給我一些想法嗎?例如,我有點不清楚,我如何告訴油漆只能在我的觀察者中看到可見的東西,如何在畫家中進行定位等等。 – Derek 2011-06-11 18:18:20

+0

http://stackoverflow.com/questions/5951072/using-qtconcurrent-to-load-a-pixmap-and-paint-it這是一個有用的線程,我一直在看,但它是使用一組QGraphicsItems而不是一個。 Whern你正在討論使用單個QGI,你的意思是僅僅使用單個QGI,還是在鏈接中提到某種「tile QGI」,並且從父項目的paint中繪製這些QGI tile ?如果是這樣,與團隊的做事方式看起來沒有多大區別? – Derek 2011-06-11 18:49:46

+0

我想問一些這些事情的主要原因 - 如果您記得,我當前的自定義Pixmap項目具有允許您在移動項目時縮放項目的功能。我猜如果我確實在tile中有一堆這些東西,我可以使用this.group()來檢測,如果它存在,將縮放傳遞給QGraphicsItemGroup,這可能會在不調整位置的情況下縮放它們,對吧? – Derek 2011-06-11 19:18:44