如何删除有一些子项作为成员的QGraphicsItem?

fat*_*ici 3 c++ qt qgraphicsitem

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

Tim*_*yer 6

像这样创建您的成员图形项:

class MyClass : public QGraphicsItem
{
    ...
private:

    SomeKindOfGraphicsItem* _item1;
    SomeOtherGraphicsItem* _item2;
}
Run Code Online (Sandbox Code Playgroud)
MyClass::MyClass( ... ) :
    QGraphicsItem( ... ),
    _item1( new SomeKindOfGraphicsItem( ..., this ) ),
    _item2( new SomeOtherGraphicsItem( ..., this ) )
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,仅从MyClass场景中删除父项(在此示例中)就足够了.这将删除所有子项:

void QGraphicsScene :: removeItem(QGraphicsItem*item)

从场景中删除项目项及其所有子项.项目的所有权传递给调用者(即,QGraphicsScene将在销毁时不再删除项目).

此外,当一个对象MyClass被删除时,它将通过Qt机制删除它的所有子对象:

QGraphicsItem ::〜QGraphicsItem()[虚]

销毁QGraphicsItem及其所有子项.如果此项目当前与场景相关联,则该项目将在删除之前从场景中删除.

注意:在销毁项目之前从QGraphicsScene中删除项目效率更高.

  • @ fatma.ekici不,这会自动发生.实际上,如果您手动执行此操作,则会有*double delete*,这会导致程序崩溃!顺便说一下,对于窗口小部件类型和其他QObject类型也是如此.它们都形成了*树*; 如果从树中删除节点,将递归删除所有子节点*; 这个过程由Qt自动完成.你只需要关心它们是*在树中,这是通过在它们的构造函数上传递父代来实现的(在这个答案的代码中,成员初始化列表中的`this`是关键). (2认同)