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

#constructor #qt4

#конструктор #qt4

Вопрос:

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

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

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

Ответ №1:

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

Затем это повторяется, поэтому дочерние элементы всех дочерних элементов удаляются.

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

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

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

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