Как я могу назначить имена объектов для всех QWidgets, QLayouts, QFrames и т. д. в моем классе графического интерфейса? Подобный код работает только в PyQt4:

for w in gui.widgets():
   w.setObjectName(str(w)

Как это работает в PyQt5? Также как я могу перебирать все объекты, а не «только» виджеты? Я знаю, что есть несколько ответов на этот вопрос для С++, но я не могу перевести их на python.

0
Luggie Böörgöör 26 Ноя 2019 в 12:46
Прежде всего, я настоятельно рекомендую вам не использовать строковое представление виджета (или объекта, если это важно) в качестве имени объекта. Тем не менее, что не работает в вашем случае? Вы получаете ошибку?
 – 
musicamante
26 Ноя 2019 в 13:22
Я получаю сообщение об ошибке: объект gui не имеет атрибутов виджетов.
 – 
Luggie Böörgöör
26 Ноя 2019 в 13:37
Я обнаружил, что это каким-то образом сохраняет некоторые строки кода: some_widget = QSomeWidget(..., objectName='button1',...) но не полностью отвечает на мой собственный вопрос.
 – 
Luggie Böörgöör
26 Ноя 2019 в 13:48
1
Также было бы очень полезно, если бы вы предоставили нам минимальный воспроизводимый пример.
 – 
musicamante
26 Ноя 2019 в 14:04
1
Насколько мне известно, функция widgets() не существует ни в одном классе QObject или QWidget. Возможно ли, что вы внедрили в свой старый код и забыли его обновить? Или, может быть, вы использовали поиск/замену для чего-то другого, что привело к переименованию этой функции?
 – 
musicamante
26 Ноя 2019 в 14:59

1 ответ

Для основных классов QObject или QWidget нет функции widget(), поэтому вы, вероятно, реализовали ее в своем собственном коде и забыли обновить ее при обновлении для PyQt5.

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

for child in self.findChildren(QObject):
    pass

Поскольку findChildren по умолчанию выполняет рекурсивный поиск, вы также можете ограничиться прямыми дочерними элементами текущего объекта:

for child in self.findChildren(QObject, options=FindDirectChildrenOnly):
    pass

В этом случае результат будет таким же, как self.children().

Обратите внимание, что не все классы в Qt наследуются от QObject.

1
musicamante 26 Ноя 2019 в 15:54