2013-04-22 57 views
0

我试图用QObject树删除机制来删除存储在列表中的列表和所有QObject。 Qt仍然是我本周的区域...QObject将QList设置为父级使用setParent()

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

最大的问题是你为什么动态分配整个列表。为什么它不只是一个''QList list''? – 2013-04-22 09:38:12

+0

不可能与QList - 你可以使用QSharedPointer。 – 2013-04-22 11:31:54

回答

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); } 
} 
+0

这解释了很多 - 但仍然没有回答我的问题。 – Remi 2013-04-22 09:22:03

+0

@Remi实际上它回答了他们两个,但是然后你将你的问题编辑成完全不同的东西。 – cmannett85 2013-04-22 09:23:18

+0

这是真的 - 对不起,我在你的答案后延长了这个问题。 – Remi 2013-04-22 09:28:43

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

+0

在客户端执行此操作并不方便... – Remi 2013-04-22 09:22:54

+0

我认为您提出的“删除列表”并不是一个好方法,我相信如果在某个模块中分配了某些内容,它应该在此处被释放。再次,你不'需要一个QList _at_all_ QObject维护儿童列表本身 – evilruff 2013-04-22 09:26:23

+0

这个模型是非常简化的。我需要在e模块中创建对象,然后使用它们并在完全不同的位置删除。 – Remi 2013-04-22 09:31:05

相关问题