0

我正在尝试使用QObject树删除机制来删除列表以及QObject存储在列表中的所有 s。Qt 仍然是我非常周到的领域......

QList<QObject*>* list = new QList<QObject*>();
QObject* obj1 = new QObject();
QObject* obj2 = new QObject();
obj1->setParent(obj2);
obj2->setParent((QObject*)list);

我在最后一行得到“分段错误”。不能QList当父母吗?它不是继承自QObject吗?

编辑

主要问题 - 是否可以方便地删除列表和所有列表元素而不扩展QList类?这需要由客户端调用,所以它必须很简单。

我想简单地打电话:

delete list;

并不是

qDeleteAll(list);
delete list;
4

2 回答 2

1

不 。QList不继承自QObject。如果您想轻松删除列表的内容,可以使用qDeleteAll(list).

编辑: 这是未经测试的,基类可能存在没有虚拟析构函数的问题 - 但请先给出它。

template < class T >
class MyList : public QList< T >
{
    static_assert( std::is_pointer< T >::value,
                   "T must be a pointer." );
    //  Constructors...
    ...
    virtual ~MyList() { qDeleteAll( *this ); }
 }
于 2013-04-22T09:07:25.110 回答
0

选项1)

QList<QObject*> list;

.. somewhere in the code

QObject * obj = new QObject();
list << obj;

... 

then 


onDelete() {    // variant 1
       QObject * ptr;
       foreach(ptr, list) {
          delete ptr;
       }
       list(clear);
}

onDelete() { // variant 2
     qDeleteAll(list);
}

选项 2)

 QObject * parent = new QObject();

 somewhere in a code 
 ...
 QObject * child1 = new QObject(parent);
 QObject * child2 = new QObject(parent);


 onDelete() {
     delete parent;   // all children deleted automatically
 }

升级版:

从您的问题更新中,我可以认为您根本没有 QList,只需使用 QObject 提供的功能,如果您需要孩子,请使用适当的 childer() 方法,该方法将为您提供 QList

于 2013-04-22T09:10:16.703 回答