Удаление пользовательского виджета из QVboxLayout
Вопрос
У меня есть QFrame с QVBoxLayout, и я добавляю свои собственные пользовательские виджеты в макет, чтобы имитировать QListWidget, но с большей информацией/функциональностью в элементах. Я добавляю виджет в макет и сохраняю ссылку в переменной элемента (это Python):
self.sv_widgets[purchase.id] = widget
self.vl_seatView.addWidget(widget)
Затем, когда я закончу с предметом, я хочу удалить его с экрана и очистить ссылку:
self.vl_seatView.removeWidget(self.sv_widgets[purchase.id])
del self.sv_widgets[purchase.id]
К сожалению, виджет все еще отображается на экране! Я проверил, и я добавляю его в макет только один раз (и, действительно, отображается только одна копия), попробовал вручную вызовать Update () в макете, но безрезультатно. Как правильно это сделать?
Решение
Ты можешь это сделать:
import sip # you'll need this import (no worries, it ships with your pyqt install)
sip.delete(self.sv_widgets[purchase.id])
sip.delete(obj)
явно Вызывает деструктор на соответствующем объекте C ++. removeWidget
не приводит к названию этого деструктора (он все еще имеет родитель в этот момент) и del
Только отмечает Питон Объект для сбора мусора.
Вы можете достичь того же самого (возможно, чище):
self.vl_seatView.removeWidget(self.sv_widgets[purchase.id])
self.sv_widgets[purchase.id].setParent(None)
del self.sv_widgets[purchase.id]
Другие советы
Вы также можете использовать self.sv_widgets [buy.id] .deletelater ()