簡體   English   中英

Qt:當boundingRect()中心不在視圖中時,不顯示自定義QGraphicsItem

[英]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::ItemIgnoresTransformationsQGraphicsItem::ItemSendsGeometryChangessetActive(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM