gpt4 book ai didi

c++ - Qt:当 boundingRect() 中心不在 View 中时,自定义 QGraphicsItem 不显示

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:03:14 33 4
gpt4 key购买 nike

我正在制作一个 Diagram (Fluxogram) 程序,几天来我一直被这个问题困扰:

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

我已经:

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

项目标志 QGraphicsItem::ItemIgnoresTransformationsQGraphicsItem::ItemSendsGeometryChanges, setActive(true) 在项目上也是如此,每次我向我调用 update(sceneRect()) 方法的场景添加箭头。尽管如此,每次我 ScrollView 时,一旦箭头的 boundingRect() 中心移离 View ,所有箭头就会消失。如果我向后滚动并且 boundingRect() 中心进入 View ,所有箭头再次出现。

有人可以告诉我我可能遗漏了什么吗?我一直在使用 Qt 的示例项目 diagramscene 作为引用,所以我的很多代码都是相似的(“按下项目工具按钮 -> 单击场景”与插入项目的关系,它们放置箭头以连接对象的方式,。 ..).

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

最佳答案

您的 Arrow 对象继承自 QGraphicsPathItem,我希望它也实现 QGraphicsItem::shape 函数。

覆盖 Arrow 类中的形状函数,以返回项目的形状。这与 boundingRect 一起用于碰撞检测和屏幕上项目的检测。

此外,在通过更改其 boundingRect 来更改项目的形状之前,您需要调用 prepareGeometryChange .

正如文档所述:-

Prepares the item for a geometry change. Call this function before changing the bounding rect of an item to keep QGraphicsScene's index up to date.

因此,在 Arrow 类中,存储一个名为 m_boundingRect 的 QRectF 并在构造函数中:-

prepareGeometryChange();
m_boundingRect = QRectF(-x, -y, x*2, y*2);

然后在boundingRect()函数中返回m_boundingRect。

如果这仍然是一个问题,我希望是 QGraphicsPainterPath 中的某些东西导致了问题,在这种情况下,您可以简单地从 QGraphicsItem 继承并存储一个 QPainterPath,您可以使用它在项目的绘画函数中绘制并返回画家路径在 shape() 中。

关于c++ - Qt:当 boundingRect() 中心不在 View 中时,自定义 QGraphicsItem 不显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26464171/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com