我制作了一个图表(Fluxogram)程序,而且我已经坚持了这个问题:
每当我将项目放在最右边的区域时,我都会自定义QGraphicsScene
。问题是我的自定义箭头(它们继承QGraphicsPathItem
)会在场景中滚动boundingRect()
中心时从场景中消失。每当场景展开时,它的sceneRect()
和视图sceneRect()
都会更新。
我'已经:
set ui->graphicsView->setViewportUpdateMode(QGraphicsView::FullViewportUpdate)
该项目上的项目标记QGraphicsItem::ItemIgnoresTransformations
和QGraphicsItem::ItemSendsGeometryChanges
,setActive(true)
,每次我向场景添加箭头时,我都会调用update(sceneRect())
方法。尽管如此,每当我滚动视图时,只要箭头的boundingRect()
中心远离视图,所有箭头都会消失。如果我向后滚动并且boundingRect()中心进入视图,则会再次出现所有箭头。
有人可以告诉我一些我可能遗失的内容吗?我一直在使用Qt的示例项目diagramcene作为参考,所以我的很多代码都是相似的("按下项目工具按钮 - >点击场景"插入项目的关系,他们放置箭头连接物体的方式,......)。
与此同时,我将尝试制作一个可以显示我的问题的最小运行示例。
答案 0 :(得分:0)
你的生活太复杂了。不要将QGraphicsPathItem
子类只使用它,并在每次锚点(从中)的位置发生变化时更新其path
值。
答案 1 :(得分:-1)
你的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,你可以在item的paint函数中绘制它,并返回画家路径在形状()。