Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QObject使用setParent()将QList设置为父对象_C++_Qt_Qobject_Qlist - Fatal编程技术网

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
 }