我正在制作一个图表(通量图)程序,并且几天来我一直被这个问题困扰:
我有一个自定义的QGraphicsScene
,每当我将一个项目放置到最右边的区域时,它就会水平扩展。问题是,每当将QGraphicsPathItem
中心从 View 中滚动出时,我的自定义箭头(它们继承boundingRect()
)就会从场景中消失。每当场景扩展时,它的sceneRect()
和 View 的sceneRect()
也会同时更新。
我有:
set ui->graphicsView->setViewportUpdateMode(QGraphicsView::FullViewportUpdate)
该项目还会在该项目上标记
QGraphicsItem::ItemIgnoresTransformations
和QGraphicsItem::ItemSendsGeometryChanges
,setActive(true)
,并且每次我向场景中添加箭头时,都会调用update(sceneRect())
方法。尽管如此,每次我滚动 View 时,箭头的boundingRect()
中心一旦离开 View ,所有箭头都会消失。如果向后滚动,并且boundingRect()中心进入 View ,则所有箭头再次出现。有人可以给我提示我可能会缺少的东西吗?我一直使用Qt的示例项目图表场景作为引用,所以我的很多代码都是相似的(“按下项目toolButton->单击场景”关系用于插入项目,即它们放置箭头以连接对象的方式)。 ..)。
同时,我将尝试制作一个最小的运行示例,以显示我的问题所在。
最佳答案
您的Arrow对象继承自QGraphicsPathItem,我希望它也实现QGraphicsItem::shape函数。
覆盖Arrow类中的shape函数,以返回项目的形状。这与boundingRect一起用于冲突检测和屏幕上项目的检测。
另外,在通过更改项目的boundingRect更改项目的形状之前,需要调用prepareGeometryChange。
如文档所述:-
因此,在Arrow类中,将一个名为m_boundingRect的QRectF存储在构造函数中:-
prepareGeometryChange();
m_boundingRect = QRectF(-x, -y, x*2, y*2);
然后在boundingRect()函数中返回m_boundingRect。
如果这仍然是一个问题,我希望这是导致问题的QGraphicsPainterPath中的一种情况,在这种情况下,您可以简单地从QGraphicsItem继承并存储一个QPainterPath,用它在项目的paint函数中进行绘制,并以shape()形式返回painter路径( )。
关于c++ - Qt:当boundingRect()中心不在 View 中时,不显示自定义QGraphicsItem,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26464171/