Qt:自定义QGraphicsItem在boundingRect()中心不在视图时不显示

时间:2014-10-20 11:07:24

标签: c++ qt qgraphicsitem qgraphicsscene

我制作了一个图表(Fluxogram)程序,而且我已经坚持了这个问题:

每当我将项目放在最右边的区域时,我都会自定义QGraphicsScene。问题是我的自定义箭头(它们继承QGraphicsPathItem)会在场景中滚动boundingRect()中心时从场景中消失。每当场景展开时,它的sceneRect()和视图sceneRect()都会更新。

我'已经:

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

该项目上的项目标记QGraphicsItem::ItemIgnoresTransformationsQGraphicsItem::ItemSendsGeometryChangessetActive(true),每次我向场景添加箭头时,我都会调用update(sceneRect())方法。尽管如此,每当我滚动视图时,只要箭头的boundingRect()中心远离视图,所有箭头都会消失。如果我向后滚动并且boundingRect()中心进入视图,则会再次出现所有箭头。

有人可以告诉我一些我可能遗失的内容吗?我一直在使用Qt的示例项目diagramcene作为参考,所以我的很多代码都是相似的("按下项目工具按钮 - >点击场景"插入项目的关系,他们放置箭头连接物体的方式,......)。

与此同时,我将尝试制作一个可以显示我的问题的最小运行示例。

2 个答案:

答案 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函数中绘制它,并返回画家路径在形状()。