Подтвердить что ты не робот

Pyqt: как удалить виджет?

У меня есть виджет QGroupBox с дочерними элементами, которые я хочу удалить. Как мне это сделать? Я не могу найти removeWidget, removeChild, removeItem или что-либо подобное в документах. Я могу только видеть, как удалить вещи из макета, но это, по-видимому, не удаляет его из фактического виджета.

4b9b3361

Ответ 1

Ну, это работает: на виджет, который я хочу удалить, вызовите widget.setParent(None). Мне нравится, как добавление в макет добавляет виджет в контейнер, но удаление из макета не... забавный материал.

Ответ 2

Если ваш виджет не имеет дочерних виджетов, которые зависят от него, я думаю, вы можете использовать:

layout.removeWidget(self.widget_name)
self.widget_name.deleteLater()
self.widget_name = None

в моих тестах, когда это виджет, у которого есть дочерние элементы:

import sip
layout.removeWidget(self.widget_name)
sip.delete(self.widget_name)
self.widget_name = None

если у вас нет имени переменной для виджета на классе или на глобальном уровне, вы все еще можете удалить из макета с помощью layout.takeAt(index) и получить указатель виджета из QLayoutItem, который возвращает эти функции с помощью QLayoutItem.widget() метод, в этом случае вам не нужно назначать None имя переменной, потому что оно не ссылается вне вашей функции.

Попробуйте оба метода и посмотрите, что сработает для вас (не пропустите память после повторения хорошей кучи раз).

Ответ 3

Вы действительно хотите удалить виджет? Не будет hide делать? IMHO принятый метод использует show/hide, чтобы виджеты отображались и исчезали из пользовательского вида.

Альтернативой является использование QStackedWidget