QObject установить QList в качестве родителя с помощью setParent ()

Я пытаюсь использовать 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

Решение

Нет. 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

Другие решения

Опция 1)

QList<QObject*> list;

.. somewhere in the code

QObject * obj = new QObject();
list << obj;

...

thenonDelete() {    // 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

По вопросам рекламы [email protected]