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