C++ QObject使用setParent()将QList设置为父对象
我正在尝试使用C++ QObject使用setParent()将QList设置为父对象,c++,qt,qobject,qlist,C++,Qt,Qobject,Qlist,我正在尝试使用QObject树删除机制删除列表和列表中存储的所有QObjects。Qt仍然是我每周的工作区域 QList<QObject*>* list = new QList<QObject*>(); QObject* obj1 = new QObject(); QObject* obj2 = new QObject(); obj1->setParent(obj2); obj2->setParent((QObject*)list); 而不是 qDelete
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);
而不是
qDeleteAll(list);
delete list;
否。
QList
不继承自QObject
。如果要轻松删除列表内容,可以使用qdeletall(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 ); }
}
模板
类MyList:public QList
{
静态断言(std::is_指针::值,
“T必须是指针。”);
//构造器。。。
...
virtual~MyList(){qdeletall(*this);}
}
选项1)
UPD:
从你的问题更新中,我可以认为你根本没有QLIST,只使用QObjor提供的功能,如果你需要孩子,使用适当的CHILDER()方法,这会给你QLIST/P>解释很多,但是仍然没有回答我的问题。但后来你把你的问题编辑成了完全不同的东西。这是真的-很抱歉,我在你的回答之后扩展了这个问题。我认为你提出的“删除列表”根本不是一个好方法,我相信如果在某个模块中分配了某个内容,它应该是免费的。再说一次,你不需要一个QList在所有QObject中维护它自己的子对象列表。这个模型非常简单。我需要在E模块中创建对象,稍后,使用它们并在完全不同的位置删除。再次,这不是改变答案,考虑一些QObjt是一个你正在谈论的列表…最大的问题是为什么你要动态地分配整个列表。为什么它不仅仅是一个
QList列表
?在QList中是不可能的-不过您可以使用QSharedPointer。
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 ); }
}
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);
}
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
}