我正在制作一个图表(通量图)程序,并且几天来我一直被这个问题困扰:

我有一个自定义的QGraphicsScene,每当我将一个项目放置到最右边的区域时,它就会水平扩展。问题是,每当将QGraphicsPathItem中心从 View 中滚动出时,我的自定义箭头(它们继承boundingRect())就会从场景中消失。每当场景扩展时,它的sceneRect()和 View 的sceneRect()也会同时更新。

我有:

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

该项目还会在该项目上标记QGraphicsItem::ItemIgnoresTransformationsQGraphicsItem::ItemSendsGeometryChangessetActive(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/

10-12 20:33