Проблема удаления QWidget - PullRequest
1 голос
/ 11 августа 2011

У меня есть стандартный класс, производный от QWidget, но я получаю двойное освобождение при уничтожении виджета.всякий раз, когда я добавляю указатель QTreeView в качестве переменной-члена.

Например:

private:
    QTreeView *m_treeView;

В конструкторе класса я делаю простое:

m_treeView = new QTreeView(this);

И QWidgetДеструктор класса -derived является деструктором по умолчанию.

Если я полностью отказываюсь от использования указателя на член и выполняю:

QTreeView *treeView = new QTreeView(this);

Все хорошо.Наличие указателей на члены QLabel также работает нормально.Почему я вижу это поведение?Независимо от того, является ли указатель членом класса, он не должен иметь никакого отношения к деструктору класса, поскольку объекты создаются в куче, и классы не удаляют объекты, на которые указывают их переменные-члены, если это не указано в инструкции.пользовательский деструктор.

1 Ответ

0 голосов
/ 11 августа 2011

Всякий раз, когда ваш производный от QWidget объект удаляется, m_treeView также будет удаляться, поскольку вы передали this в качестве родительского объекта при создании m_treeView

Это происходит потому, что new QTreeView(this) в конечном итоге вызовет QObject( QObject * parent ) и это означает, что ваша переменная-член добавляется как дочерний объект вашего объекта, производного от QWidget.

Деструктор родительского объекта уничтожает все дочерние объекты.

Начиная с документы Qt

EDIT : Извините, пропустил

И деструктор класса, производного от QWidget, является деструктором по умолчанию.1023 *

часть

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...