pyqt: как убрать виджет?
У меня есть виджет QGroupBox с дочерними элементами, которые я хочу удалить. Как мне это сделать? Я не могу найти removeWidget , removeChild , removeItem или что-либо подобное в документах. Я могу только видеть, как удалить вещи из макета, но это, по-видимому, не удаляет его из фактического виджета.
3 ответа
Ну, это работает: на виджет, который я хочу удалить, вызовите widget.setParent(None) . Мне нравится, как добавление в макет добавляет виджет в контейнер, но удаление из макета не. забавный материал.
Если ваш виджет не имеет дочерних виджетов, которые зависят от него, я думаю, вы можете использовать:
в моих тестах, когда это виджет, у которого есть дочерние элементы:
если у вас нет имени переменной для виджета на классе или на глобальном уровне, вы все еще можете удалить из макета с помощью layout.takeAt(index) и получить указатель виджета из QLayoutItem, который возвращает эти функции с помощью QLayoutItem.widget() метод, в этом случае вам не нужно назначать None имя переменной, потому что оно не ссылается вне вашей функции.
Попробуйте оба метода и посмотрите, что сработает для вас (не пропустите память после повторения хорошей кучи раз).
Вы действительно хотите удалить виджет? Не будет hide делать? IMHO принятый метод использует show / hide , чтобы виджеты отображались и исчезали из пользовательского вида.
pyqt: how to remove a widget?
I have a QGroupBox widget with children in it that I want to remove. How do I do that? I can’t find any removeWidget , removeChild , removeItem , or anything similar in the docs. I can only see how to remove things from a layout, but that, apparently, doesn’t remove it from the actual widget.
2 Answers 2
If your widget have no child widgets that depend on it i think you can use:
in my tests when it is a widget that have childs you have to:
if you don’t have a variable name for the widget at class or global level you still can remove from layout with layout.takeAt(index) and get the widget pointer from the QLayoutItem this functions returns with QLayoutItem.widget() method, in that case you don’t need to assign to None the variable name because it is not referenced outside your function.
Try both methods and see what works for you (don’t leak memory after repeat a good bunch of times).
Удаление виджета в PyQt5
Допустим, есть QVBoxLayout, в который динамически добавляются кнопки:
Это происходит внутри метода класса и по идее все переменные локальные, так что должны уничтожиться после выхода из него (если сделать button = None в конце, то ничего не меняется).
А затем в какой-то момент времени мы хотим удалить эти кнопки:
В результате данного цикла кнопки удаляются лишь из layout’а, но не сами объекты. Это выглядит как видимые кнопки, которые больше не подчиняются layout. Если же делать не просто takeAt, а вызывать deleteLater к полученному takeAt виджету, то приложение крашится.
Очистить все виджеты в макете в Pyqt
Есть ли способ очистить (удалить) все виджеты в макете?
Теперь я хочу заменить виджет в plot_layout новым виджетом. Есть ли простой способ очистить все виджеты в plot_layout ? Я не вижу такого способа.
11 ответов
После долгих исследований (и это заняло довольно много времени, поэтому я добавил его сюда для дальнейшего использования), я нашел способ действительно очистить и удалить виджеты в макете:
Документация говорит о QWidget :
Новый виджет удаляется при удалении его родителя.
Важное примечание: вам нужно выполнить цикл в обратном направлении, поскольку удаление элементов с начала сдвигает элементы и меняет порядок элементов в макете.
Чтобы проверить и подтвердить, что макет пуст:
Кажется, есть другой способ сделать это. Вместо использования функции setParent используйте функцию deleteLater (), подобную этой :
В документации сказано, что QObject.deleteLater (self)
Планирует этот объект для удаления.
Однако, если вы запустите тестовый код, указанный выше, он напечатает некоторые значения. Это указывает на то, что макет по-прежнему содержит элементы, в отличие от кода с setParent .