QWidget * parent в качестве аргумента в конструкторе определенного пользователем класса - PullRequest
1 голос
/ 10 мая 2011

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

Теперь я вижу QWidget * parent , передаваемый конструктору пользовательского класса здесь, по этой ссылке: http://doc.qt.io/archives/qt-4.7/tutorials-addressbook-part1.html Класс AddressBook: общедоступный QWidget { Q_OBJECT

 public:
     AddressBook(QWidget *parent = 0);

 private:
     QLineEdit *nameLine;
     QTextEdit *addressText;
 };

Что это значит?

Ответы [ 2 ]

3 голосов
/ 10 мая 2011

Виджеты Qt, особенно при их объединении, определяют иерархию.Давайте посмотрим на это визуально на (упрощенном) примере.

В моем приложении у меня есть центральный QWidget.Помимо этого есть два других виджета.QGLWidget для некоторого 3D-рендеринга и QTabWidget для элементов управления.Эти два виджета являются потомками моего центрального QWidget.

QTabWidget имеет вкладки, которые сами являются QWidget.И кажется логичным, чтобы они были детьми QTabWidget, верно?

И я могу продолжать.Возможно, на одной из вкладок есть несколько кнопок, на другой вкладка - какие-нибудь текстовые поля.

То, что вы здесь делаете, это создаете иерархию QWidgets.Так что в случае с этим примером это будет выглядеть примерно так:

QWidget (the Central Widget)
|
|-QGLWidget (my rendering window)
|-QTabWiget (the tab widget for my controls)
 |
 |-QWidget (the first tab)
 ||
 ||-QPushButton (a button on the first tab)
 |
 |-QWidget (the second tab)
  |
  |-QLineEdit (a widget to provide some input)

В любом случае, вы поймете мой дрейф.Возвращаясь к вашему коду, вы можете определить эту иерархию с помощью конструктора QWidget (или любого производного виджета).Если я создам свой QGLWidget, в его конструкторе я предоставлю указатель на мой центральный QWidget в качестве его родителя.

Есть несколько причин для этой иерархии.Вы упоминаете создание / удаление.Но также представьте, если вы переключаете вкладки.Какой элемент должен отображаться в верхней части вкладки?Свои дети конечно.И если вы начнете работать с Qt, вы узнаете о Layouts.Установка макета для виджета повлияет на всех дочерних элементов этого виджета.Есть несколько других причин (и все происходит за кулисами), но этого должно быть достаточно.

Мое объяснение довольно концептуально.Возможно, это не самое технически подробное и правильное объяснение, но оно должно дать вам несколько советов.

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

Довольно много текста, но я надеюсь, что это несколько объясняет концепции.Посмотрите на некоторые примеры, которые поставляются с Qt.Вы должны получить представление о том, как все устроено.Если вы не видите, как они соединяются, нарисуйте диаграмму, как я делал выше.Это должно начать иметь смысл для вас.Если у кого-то есть исправления или более техническая информация, которая может быть полезна, не стесняйтесь комментировать или исправлять меня.

Надеюсь, это поможет.

1 голос
/ 10 мая 2011

Конструктор устанавливает отношения родитель-потомок между виджетами.

Помимо управления памятью и ее организации (которые также действительны для простых объектов QObject) и макета (что не является обязательным - вы можете иметь дочерние виджеты вне макета родителя), отношения родителя-ребенка принимают интересный поворот для QWidgets:

Любой QWidget, у которого нет родителя, станет окном, и на большинстве платформ будет отображаться на панели задач рабочего стола.

(взято из Виджетов окон и диалогов , документация Qt 4.7.)

...