从 QGraphicsScene/QgraphicsItemGroup/QGraphicsView 中正确删除项目
Posted
技术标签:
【中文标题】从 QGraphicsScene/QgraphicsItemGroup/QGraphicsView 中正确删除项目【英文标题】:Properly removing items from QGraphicsScene/QgraphicsItemGroup/QGraphicsView 【发布时间】:2014-07-23 12:14:48 【问题描述】:我正在尝试使用QGraphicsView
、QGraphicsScene
&& QGraphicsItemGroup
绘制带有可移动控制点的图。我遇到的问题是我找不到任何删除/删除项目的方法。
我的想法如下:
我将有一个 QGraphicsView,它上面将是可移动的插值点,并且在它下面将绘制一个穿过这些点的图。
为了实现这一点,我正在考虑使用两个(或更多)QGraphicsItemGroups
。
- 一个用于插值点,因为我需要拖动它们所以无法移除
- 一个用于显示在它们下面的实际情节
为此,我要将线条添加到第一组中并显示它们。但是会有很多重绘,我现在不知道如何正确地从QGraphicsView
/QGraphicsScene
/QGraphicsItemGroup
中删除项目,所以它不会再显示了。请记住,我只需要删除/替换一组项目而不删除所有其他项目。
我正在浏览文档和教程,但找不到任何有用的东西。
【问题讨论】:
您需要做的就是销毁和释放您希望消失的物品。他们在一个群体中的事实并不重要。delete
做这两项工作:)
【参考方案1】:
您需要从了解图形视图/场景系统开始。 例如,您声明以下内容:-
“我将有一个 QGraphicsView,上面有……”
这没有意义。 QGraphicsView 就像一个通往世界的窗口(QGraphicsScene)。因此,您将把派生自 QGraphicsItem 或 QGraphicsObject 的项目放入场景中。这些是通过 QGraphicsView 查看的。
添加一个项目很简单,你可以调用QGraphicsScene函数addItem,它接受一个QGraphicsItem*。
在这种情况下,您有一个指向该项目的指针,因此如果您调用QGraphicsScene::removeItem,它将从场景中删除它,然后您可以删除该项目。如果删除发生在槽函数内部,我建议使用对 deleteLater 的调用,而不是直接删除指针。
您的问题提到了 QGraphicsItemGroups。如上,有QGraphicsScene::createItemGroup和QGraphicsScene::destroyItemGroup这两个函数。
如 destroyItemGroup 的文档所述:-
将组中的所有项重新设置为组的父项,然后从场景中删除组,最后将其删除
因此,在这种情况下,调用 destroyItemGroup 只会销毁组。因此,在调用 destroyItemGroup 之前,您需要先移除和删除项目。
请注意,如果您只是删除场景中的某个项目,它将自动删除。
最后,请注意 Qt GraphicItems 使用 Qt 的父层次结构,因此您可以简单地作为父对象,而不是使用项目组。
【讨论】:
以上是关于从 QGraphicsScene/QgraphicsItemGroup/QGraphicsView 中正确删除项目的主要内容,如果未能解决你的问题,请参考以下文章