Получить виджеты макета в PyQT
У меня есть QVBoxLayout
что я добавил несколько виджетов, через addWidget()
, Теперь мне нужно удалить эти виджеты, и, кажется, мне нужно использовать removeWidget()
(который принимает виджет, который будет удален), чтобы сделать это.
Я думал что звоню children()
или же findChildren(QWidget)
на моем макете будет возвращен список виджетов, которые я добавил в него; Я в отладчике, но получаю пустые списки.
Я что-то ужасно неправильно понимаю? Я только начал заниматься PyQT на прошлой неделе и в основном учился методом проб и ошибок с помощью документации по API.
2 ответа
Это странно. Насколько я понимаю, что добавление виджетов с помощью addWidget
передает право собственности на макет так называемый children()
должен работать.
Тем не менее, в качестве альтернативы вы можете зациклить элементы макета, используя count()
а также itemAt(int)
поставить QLayoutItem
в removeItem(QLayoutItem*)
,
Редактировать:
Я только что попробовал addWidget
с прямым тестовым приложением C++. и это не переносит QObject
право собственности на макет так children()
действительно пустой список. Документы ясно говорят, что право собственности передается, хотя...
Изменить 2:
Хорошо, похоже, что он передает владение виджету, имеющему этот макет (а это не то, что сказано в документации). Это делает элементы в макете братьев и сестер самого макета в QObject
Иерархия! Поэтому легче придерживаться count
а также itemAt
,
Чтобы получить виджет из QLayout, вы должны вызвать его itemAt(index)
метод. Как следует из названия этого метода, он вернет элемент вместо виджета. призвание widget()
по результату наконец-то выдаст вам виджет:
myWidget = self.myLayout.itemAt(index).widget()
Чтобы удалить виджет, установите родительский виджет на None
:
myWidget.setParent(None)
Также действительно полезным является QLayout count()
метод. Чтобы найти и удалить все содержимое макета:
index = myLayout.count()
while(index >= 0):
myWidget = myLayout.itemAt(index).widget()
myWidget.setParent(None)
index -=1