Почему раскладки Qt являются потомками его виджета? - PullRequest
1 голос
/ 11 марта 2020

При работе с приложением Qt, если я создаю виджет как root и у меня есть связанный QHboxLayout с виджетом, когда я добавляю виджеты в макет, вызов children() для виджета (root) будет вернуть список его дочерних виджетов, включая объект макета, который прикреплен к виджету. При чтении документации для раскладок Qt, раскладки описываются как нечто, что должно быть связано с QWidget, а не как его дочерний элемент, потому что его можно установить, вызывая setLayout. Макет не отображается, но у макета есть родитель. Макет отвечает за помощь в изменении размера детей для QWidget.

Мой вопрос: почему у Qlayout должен быть родитель, для чего это используется? И почему макет должен быть возвращен как дочерний элемент QWidget, когда я вызываю children() в виджете? Я никогда не хотел бы возвращать макет, я ожидал бы, что возвращались только виджеты, учитывая, что он фактически не отображается, в отличие от виджета, но служит для оказания помощи в рендеринге для изменения размера виджета.

1 Ответ

1 голос
/ 11 марта 2020

QWidget и QLayout являются QObject, и у QObjects может быть отношение родства, как документы указывают:

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

И, как указывалось, основная функция заключается в освобождении памяти детей при уничтожении родителя. что в C ++ важно избегать утечек памяти, и то же самое передается в Python bindings.

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

Если вы хотите получить виджет детей, вы должны использовать метод QObject::findChildren():

c ++

QList<QWidget *> childrens = widget.findChildren<QWidget *>(Qt::FindDirectChildrenOnly);

python

childrens = widget.findChildren(QtWidgets.QWidget, QtCore.Qt.FindDirectChildrenOnly)

Примечание: Если вы хотите получить рекурсивный доступ к детям, то вы должны изменить Qt::FindDirectChildrenOnly на Qt::FindChildrenRecursively.

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