C++ 如何删除包含一些子项作为成员的QGraphicsItem?
我有一个继承QGraphicsItem的自定义项。它有一些子图形项作为成员变量。我应该按什么顺序从场景中删除这些项目,以及如何删除它们?创建成员图形项目,如下所示:C++ 如何删除包含一些子项作为成员的QGraphicsItem?,c++,qt,qgraphicsitem,C++,Qt,Qgraphicsitem,我有一个继承QGraphicsItem的自定义项。它有一些子图形项作为成员变量。我应该按什么顺序从场景中删除这些项目,以及如何删除它们?创建成员图形项目,如下所示: class MyClass : public QGraphicsItem { ... private: SomeKindOfGraphicsItem* _item1; SomeOtherGraphicsItem* _item2; } 在这种情况下,仅从场景中移除父项(在本例中为MyClass)就
class MyClass : public QGraphicsItem
{
...
private:
SomeKindOfGraphicsItem* _item1;
SomeOtherGraphicsItem* _item2;
}
在这种情况下,仅从场景中移除父项(在本例中为
MyClass
)就足够了。这也将删除所有子项:
作废QGraphicscene::删除项(QGraphicsItem*项)
从场景中删除项目及其所有子项。项目的所有权将传递给调用者(即,QGraphicscene在销毁时将不再删除项目)
此外,当MyClass
的对象被删除时,它将通过Qt
机制删除其所有子对象:
QGraphicsItem::~QGraphicsItem()[虚拟]
销毁QGraphicsItem及其所有子项。如果该项目当前与场景关联,则在删除该项目之前,该项目将从场景中删除
注意:在销毁项目之前,从QGraphicscene中删除项目更有效
是否需要删除析构函数中的子项?事实上,这可能会导致问题。@fatma.ekici不,这是自动发生的。事实上,如果您手动执行此操作,您将有一个双重删除,这将使您的程序崩溃!顺便说一句,小部件类型和其他QObject类型也是如此。它们都形成一棵树;如果从树中删除一个节点,所有子节点都将被递归删除;此过程由Qt自动完成。您只需注意它们位于树中,这是通过在其构造函数上传递父项来实现的(此答案代码中成员初始值设定项列表中的
this
是键)。我不会删除主项的析构函数中的任何子项。但当我在从场景中删除该项目后调用delete mainItem时,程序崩溃。如果我不调用delete mainItem并仅从场景中删除该项目,该项目的某些部分仍保留在sceneThanks@leemes上。我解决了这个问题。结果是我意外地在paint函数中创建了一个子成员。简而言之,不需要为子项调用removeItem,也不需要删除父项析构函数中的子项。请注意,将它们添加为成员并不意味着它们是Qt定义此关系的子项。您必须在即将成为子项的项目中设置父项,即您自己(this
),可以在构造函数中设置,也可以在之后使用childItem->setParent(this)
。它们是成员变量,将主项作为父项。然后一切正常。但这一评论可能对未来的读者很重要,因为这可能是一个容易犯的错误。
MyClass::MyClass( ... ) :
QGraphicsItem( ... ),
_item1( new SomeKindOfGraphicsItem( ..., this ) ),
_item2( new SomeOtherGraphicsItem( ..., this ) )
{
...
}