从 QGraphicsScene/QgraphicsItemGroup/QGraphicsView 中正确删除项目

Posted

技术标签:

【中文标题】从 QGraphicsScene/QgraphicsItemGroup/QGraphicsView 中正确删除项目【英文标题】:Properly removing items from QGraphicsScene/QgraphicsItemGroup/QGraphicsView 【发布时间】:2014-07-23 12:14:48 【问题描述】:

我正在尝试使用QGraphicsViewQGraphicsScene && 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 中正确删除项目的主要内容,如果未能解决你的问题,请参考以下文章

从PRISM开始学WPFMVVMViewModel?

在 python 中,为啥从数组读取比从列表读取慢?

从图库中挑选或从相机捕获的高质量图像

从PRISM开始学WPFMVVMCommand?

从PRISM开始学WPFPrism?

mysql 主-主-从-从