2014-10-20 165 views
2

我正在做一個圖(Fluxogram)計劃和天我堅持這個問題:的Qt:自定義的QGraphicsItem沒有顯示時boundingRect()中心拿出來看

我有一個自定義QGraphicsScene一個可擴展水平地每當我把一個項目放在最右邊的區域時。問題是我的自定義箭頭(它們繼承QGraphicsPathItem)從場景中消失,只要boundingRect()中心從視圖中滾動出來。每當場景擴展時,它的sceneRect()和視圖的sceneRect()都會更新。

我有:

set ui->graphicsView->setViewportUpdateMode(QGraphicsView::FullViewportUpdate) 

項標誌的項目QGraphicsItem::ItemIgnoresTransformationsQGraphicsItem::ItemSendsGeometryChangessetActive(true)爲好,每次我加一個箭頭現場我稱之爲update(sceneRect())方法。不過,每當我滾動視圖時,只要箭頭的中心遠離視圖,所有箭頭消失。如果向後滾動並且boundingRect()中心進入視圖,則所有箭頭都會再次出現。

有人可以給我一個我可能會錯過的小費嗎?我一直在使用Qt的示例項目圖形作爲參考,所以我的很多代碼是類似的(「按項目工具按鈕 - >點擊場景」插入項目的關係,他們放置箭頭連接對象的方式。 ..)。

與此同時,我會嘗試做一個最小的運行示例,可以顯示我的問題是什麼。

+0

我做了最簡單的例子,我可以保留迄今爲止用於解決此問題的方法。我已經將它粘貼到了pastebin(我不知道我是否可以在這裏使用它,所以請讓我知道它是不是應該怎麼做,只是有很多編碼來確定場景的定位和重新調整): 頭文件:http://pastebin.com/43Vzkrkq; C++文件:http://pastebin.com/aLuE5Yg4; UI文件:http://pastebin.com/1mHWL0hG – Qvaliz 2014-10-20 12:16:03

+0

我懷疑問題在於該項目的boundingRect。嘗試在繪製函數中繪製它,看看它是否是你期望看到的。 – TheDarkKnight 2014-10-20 12:53:52

+0

這是,它繪製箭頭連接的2個物品周圍的矩形。問題是,當我們在網格的最右邊添加一些項目時,場景會水平展開,如果我們滾動,只要boundingRect中心(item的(0,0))不在視圖的視線內,整個箭頭消失,如果我們滾動,直到中心再次可見,則整個箭頭再次出現。我需要的是無論可見區域有多小,始終都能看到箭頭。 – Qvaliz 2014-10-20 13:12:03

回答

-1

您的箭頭對象繼承自QGraphicsPathItem,我期望還實現了QGraphicsItem :: shape函數。

覆蓋您的箭頭類中的形狀函數,以返回項目的形狀。這與boundingRect一起用於碰撞檢測和屏幕上的項目檢測。

另外,在通過更改其boundingRect更改項目的形狀之前,您需要致電prepareGeometryChange

隨着文檔狀態: -

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

所以,在箭類,存儲了一個名爲m_boundingRect QRectF並在構造函數: -

prepareGeometryChange(); 
m_boundingRect = QRectF(-x, -y, x*2, y*2); 

然後在boundingRect()函數返回m_boundingRect。

如果這仍然是一個問題,我期望它是QGraphicsPainterPath中導致問題的東西,在這種情況下,您可以簡單地從QGraphicsItem繼承並存儲一個QPainterPath,並在該項目的繪製函數中繪製並返回畫家形狀路徑()。

+0

剛做完了,箭頭仍然消失(我通過將paint()方法的路徑定義替換爲構造函數,並將其保存在arrow.h中預定義的變量中,paint方法只是調用painter-> drawPath(«path_variable_name»))。 – Qvaliz 2014-10-20 13:31:16

+0

聽起來不錯 - 不必在繪製函數中計算對象會更快。我已經更新了答案,並且缺少了對prepareGeometryChange的調用。 – TheDarkKnight 2014-10-20 14:41:35

+0

它們仍然消失:(接下來,我甚至在調用prepareGeometryChange()之後調用update,認爲它可能需要在對構造函數上的m_boundingRect進行更改之後強制更新boundingRect,但沒有成功 – Qvaliz 2014-10-20 15:22:39

0

你讓你的生活過於複雜。每次錨(from to)的位置發生變化時,不要繼承QGraphicsPathItem的子類並更新它的path值。

+0

問題在於錨點的位置從不改變,當場景的水平長度大於視圖時,唯一改變的是graphicsView的可視區域。 – Qvaliz 2014-10-20 13:51:32

+0

更好(更容易)。只需生成所需的路徑設置它將其設置爲「QGraphicsPathItem」,它將像魅力一樣工作。你沒有手動繪畫,也沒有計算'boundingRect'。 – 2014-10-20 14:17:04

+0

我試過了,事實上箭頭並沒有消失(雖然定位搞砸了,但這是一個代碼調整的問題),但後來我記得在程序的開發中我還需要擦除如果我刪除一個箭頭連接的項目,如果我只畫出了路徑,那麼如果它們不是項目,我將無法刪除它們,我錯了嗎? – Qvaliz 2014-10-20 15:25:25