Страницы

Поиск по вопросам

среда, 12 февраля 2020 г.

Как правильно закрыть окно Qt?

#cpp #qt


Есть многооконное приложение. Виджеты иногда меняют родителей и переходят из одного
окна в другое. Возникает необходимость закрывать окна с остатками виджетов. Например,
было два окна, в каждом по два QLabel. Из одного окна в другое перешел QLabel. Окно
с оставшимся в нем одним QLabel больше не нужно и его можно полностью удалить со всеми
виджетами в нем. Как теперь правильно удалить это окно, чтобы не было утечек памяти
и других неприятных вещей? Или память освобождается автоматически?
    


Ответы

Ответ 1



Для каждого окна установите атрибут: setAttribute(Qt::WA_DeleteOnClose); Этот атрибут делает следующее: Makes Qt delete this widget when the widget has accepted the close event (see QWidget::closeEvent()). Другими словами, когда окно получает QCloseEvent, оно самоуничтожается

Ответ 2



Виджет-родитель при уничтожении автоматически удалит своих потомков. When QObjects are created on the heap (i.e., created with new), a tree can be constructed from them in any order, and later, the objects in the tree can be destroyed in any order. When any QObject in the tree is deleted, if the object has a parent, the destructor automatically removes the object from its parent. If the object has children, the destructor automatically deletes each child. No QObject is deleted twice, regardless of the order of destruction. Object Trees & Ownership Другими словами если у вас что-то отображается в окне, то достаточно удалить виджет окна, об остальном позаботится система объектных иерархий Qt.

Комментариев нет:

Отправить комментарий