2013-04-22 4 views
0

Я пытаюсь использовать механизм удаления дерева QObject, чтобы удалить список, и все QObject s, которые хранятся в списке. 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?

Edit:

Главный вопрос - можно удобно удалить список и список всех элементов без расширения QList класса? Это нужно вызвать клиентом, чтобы он был простым.

Я хотел бы просто позвонить:

delete list; 

и не

qDeleteAll(list); 
delete list; 
+0

Самый большой вопрос, почему вы динамически выделяете весь список вообще. Почему это не просто '' QList list''? –

+0

Невозможно с QList - вы могли бы использовать QSharedPointer. –

ответ

1

No. QList не наследует от QObject. Если вы хотите легко удалить содержимое списка, вы можете использовать qDeleteAll(list).

Edit: Это проверялось, и могут возникнуть проблемы из базового класса, не имея виртуальный деструктор - но отдать его назад.

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

+0

@Remi На самом деле он ответил на оба из них, но затем вы редактировали свой вопрос во что-то совершенно другое. – cmannett85

+0

Это правда - извините, я продлил вопрос после ваших ответов. – Remi

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

+0

Я думаю, что вы предлагаете «удалить список», это не очень хороший подход, я считаю, что если что-то выделено в определенном модуле, оно должно быть свободным. и снова вам не нужен QList _at_all_ QObject поддерживает список самих детей – evilruff

+0

Эта модель очень упрощена. Мне нужно создать объекты в модуле e, а затем использовать их и удалить в совершенно другом месте. – Remi

Смежные вопросы