Какова цель родителя QWidget? - PullRequest
8 голосов
/ 10 января 2012

Если я вложил в подкласс любой виджет, то обычный шаблон:

ZTabWidget::ZTabWidget(QWidget *parent):QTabWidget(parent){
  blah ... blah ...
}

Обычный шаблон:

WidgetB widgetb = new WidgetB(widgeta)
widgeta.addWidget(widgetb);

Есть ли какой-либо вред, если все мои виджеты назначены MainWindow как их соответствующиеparent - хотя, следуя иерархии addWidget, у большинства этих виджетов есть другой виджет как родительский элемент addWidget:

WidgetB widgetb = new WidgetB(mainWindow)
widgeta.addWidget(widgetb);

Причина, по которой я хочу это сделать, заключается в том, что mainWindow содержит все основные элементыприложение и что я мог бы иметь любой из моих подклассов виджетов ссылки на эти элементы.

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

Точно, какая польза от регистрации родителя для QWidget?Родитель даже используется внутренне?

Должен ли родитель addWidget быть таким же, как родительский конструктор?

1 Ответ

16 голосов
/ 10 января 2012

На самом деле есть два аспекта двух ваших вопросов:

Управление памятью

Древовидная организация QWidgets (и фактически любого QObjects) является частью памятистратегия управления, используемая в Qt-Framework.Присвоение QObject родительскому объекту означает, что право собственности на дочерний объект передается родительскому объекту.Если родитель удален, все его дочерние элементы также будут удалены.Из документов :

QObjects организуются в деревья объектов.Когда вы создаете QObject с другим объектом в качестве родителя, объект автоматически добавится в список дочерних элементов родителя ().Родитель получает право собственности на объект;т.е. он автоматически удалит своих потомков в своем деструкторе.Вы можете искать объект по имени и, при необходимости, вводить текст с помощью findChild () или findChildren ().

Это означает, что вы можете организовывать свои виджеты любым удобным для вас способом (если вы этого не делаете).не вводит утечки памяти).Однако я считаю, что обычной практикой является назначение всех виджетов соответствующему контейнеру (либо явно, либо лучше, используя такие методы, как addWidget).

Если виджет назначен на QLayout с использованием addWidget, затем право собственности на виджет передается макету (который, в свою очередь, вероятно, принадлежит другому окружающему макету или главному окну).Так что да, отношение, определенное этим методом, включает в себя более общие отношения родитель-потомок, описанные выше.

Теперь, как только основное окно разрушается, по существу, все дерево QObjects удаляется по мере того, как вы 'd ожидайте.

Следовательно, если вы оставите объект «без родителей», вы несете ответственность за его удаление.

Семантика GUI

Как правильно заметил Фрэнк, в некоторыхконтекст отношения родитель-потомок между QWidgets также имеет семантическое значение для структуры GUI.Примером этого являются модальные диалоги, которые блокируют своих родителей, пока они остаются открытыми.

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