我正在尝试使用QObject
树删除机制来删除列表中存储的列表和所有QObject
。 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;
答案 0 :(得分: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 ); }
}
答案 1 :(得分: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
}
UPD:
从您的问题更新中,我可以认为您根本没有QList,只需使用QObject提供的功能,如果您需要孩子,请使用适当的childer()方法,它将为您提供QList