![](/img/trans.png)
[英]Qt: resize a QGraphicsItem (boundingRect()) into a QGraphicsScene with the mouse
[英]Qt: Custom QGraphicsItem not showing when boundingRect() center is out of view
我正在制作一個圖表(通量圖)程序,並且幾天來我一直被這個問題困擾:
我有一個自定義的QGraphicsScene
,每當我將一個項目放置到最右邊的區域時,它就會水平擴展。 問題在於,只要將boundingRect()
中心從視圖中滾動出,我的自定義箭頭(它們繼承QGraphicsPathItem
)就會從場景中消失。 每當場景擴展時,它的sceneRect()
和視圖的sceneRect()
也會被更新。
我有:
set ui->graphicsView->setViewportUpdateMode(QGraphicsView::FullViewportUpdate)
該項目QGraphicsItem::ItemIgnoresTransformations
在該項目上標記QGraphicsItem::ItemIgnoresTransformations
和QGraphicsItem::ItemSendsGeometryChanges
, setActive(true)
,並且每次向場景添加箭頭時,都會調用update(sceneRect())
方法。 盡管如此,每次我滾動視圖時,箭頭的boundingRect()
中心一旦從視圖移開,所有箭頭都會消失。 如果向后滾動,並且boundingRect()中心進入視圖,則所有箭頭再次出現。
有人可以給我提示我可能會缺少的東西嗎? 我一直使用Qt的示例項目圖表場景作為參考,所以我的很多代碼都是相似的(“按下項目toolButton->單擊場景”關系用於插入項目,即它們放置箭頭以連接對象的方式。 ..)。
同時,我將嘗試制作一個最小的運行示例,以顯示我的問題所在。
您的生活太復雜了。 請勿在僅使用QGraphicsPathItem
子類的情況下使用它,並在錨點(從到)每次更改時更新其path
值。
您的Arrow對象繼承自QGraphicsPathItem,我希望它也實現QGraphicsItem :: shape函數。
覆蓋Arrow類中的shape函數,以返回項目的形狀。 這與boundingRect一起用於沖突檢測和屏幕上項目的檢測。
另外,在通過更改項目的boundingRect更改項目的形狀之前,需要調用prepareGeometryChange 。
如文檔所述:-
准備要更改幾何的項目。 在更改項目的邊界矩形以保持QGraphicsScene的索引最新之前,請調用此函數。
因此,在Arrow類中,將一個名為m_boundingRect的QRectF存儲在構造函數中:-
prepareGeometryChange();
m_boundingRect = QRectF(-x, -y, x*2, y*2);
然后在boundingRect()函數中返回m_boundingRect。
如果這仍然是一個問題,我希望這是導致問題的QGraphicsPainterPath的問題,在這種情況下,您可以簡單地從QGraphicsItem繼承並存儲一個QPainterPath,用它在項目的paint函數中進行繪制,並以shape()形式返回painter路徑( )。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.