C++ 如何删除包含一些子项作为成员的QGraphicsItem?

C++ 如何删除包含一些子项作为成员的QGraphicsItem?,c++,qt,qgraphicsitem,C++,Qt,Qgraphicsitem,我有一个继承QGraphicsItem的自定义项。它有一些子图形项作为成员变量。我应该按什么顺序从场景中删除这些项目,以及如何删除它们?创建成员图形项目,如下所示: class MyClass : public QGraphicsItem { ... private: SomeKindOfGraphicsItem* _item1; SomeOtherGraphicsItem* _item2; } 在这种情况下,仅从场景中移除父项(在本例中为MyClass)就

我有一个继承QGraphicsItem的自定义项。它有一些子图形项作为成员变量。我应该按什么顺序从场景中删除这些项目,以及如何删除它们?

创建成员图形项目,如下所示:

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 ) )
{
    ...
}