На самом деле есть два аспекта двух ваших вопросов:
Управление памятью
Древовидная организация QWidgets
(и фактически любого QObjects
) является частью памятистратегия управления, используемая в Qt-Framework.Присвоение QObject
родительскому объекту означает, что право собственности на дочерний объект передается родительскому объекту.Если родитель удален, все его дочерние элементы также будут удалены.Из документов :
QObjects организуются в деревья объектов.Когда вы создаете QObject с другим объектом в качестве родителя, объект автоматически добавится в список дочерних элементов родителя ().Родитель получает право собственности на объект;т.е. он автоматически удалит своих потомков в своем деструкторе.Вы можете искать объект по имени и, при необходимости, вводить текст с помощью findChild () или findChildren ().
Это означает, что вы можете организовывать свои виджеты любым удобным для вас способом (если вы этого не делаете).не вводит утечки памяти).Однако я считаю, что обычной практикой является назначение всех виджетов соответствующему контейнеру (либо явно, либо лучше, используя такие методы, как addWidget
).
Если виджет назначен на QLayout
с использованием addWidget
, затем право собственности на виджет передается макету (который, в свою очередь, вероятно, принадлежит другому окружающему макету или главному окну).Так что да, отношение, определенное этим методом, включает в себя более общие отношения родитель-потомок, описанные выше.
Теперь, как только основное окно разрушается, по существу, все дерево QObjects
удаляется по мере того, как вы 'd ожидайте.
Следовательно, если вы оставите объект «без родителей», вы несете ответственность за его удаление.
Семантика GUI
Как правильно заметил Фрэнк, в некоторыхконтекст отношения родитель-потомок между QWidgets
также имеет семантическое значение для структуры GUI.Примером этого являются модальные диалоги, которые блокируют своих родителей, пока они остаются открытыми.