Будет ли QApplication автоматически освобождать все свои дочерние виджеты при выходе из системы ()? - PullRequest
2 голосов
/ 06 октября 2011

Мне интересно, для класса, подобного следующему, нужно ли вызывать delete mainLayout вручную?

class Dummy : public QWidget { 
        public:
                Dummy() { mainLayout = new QHBoxLayout(); setLayout(mainLayout); }
                ~Dummy() { delete mainLayout; } 
        private:
                QHBoxLayout *mainLayout;
}

Будет ли QApplication автоматически освобождать все свои дочерние виджеты?

1 Ответ

4 голосов
/ 06 октября 2011

Когда вызывается деструктор объекта Dummy, также вызывается его деструктор базового класса QWidget (C ++), а деструктор QWidget заботится об удалении любых виджетов, родительским объектом которых является этот объект Dummy. То есть каждый дочерний объект этого объекта-пустышки автоматически удаляется.

Это повторяется, поэтому дети всех детей удаляются.

Таким образом, при закрытии приложения Qt единственными QWidgets (ну, фактически, QObjects), которые вам нужно удалить вручную, являются те, чьи родители равны 0, то есть родительские объекты верхнего уровня. Их деструкторы автоматически обеспечат уничтожение всех своих детей.

Как описано на странице пространства имен *1007*, есть также флаг Qt :: WA_DeleteOnClose. Это:

Заставляет Qt удалить этот виджет, когда он принял событие закрытия (см. QWidget :: closeEvent ()).

Я думаю, что этот флаг обычно не используется. Таким образом, хорошее общее правило - просто убедиться, что вы удаляете свои виджеты верхнего уровня, когда приложение закрывается.

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