Удаление пользовательского виджета из QVboxLayout

StackOverflow https://stackoverflow.com/questions/1869034

  •  18-09-2019
  •  | 
  •  

Вопрос

У меня есть 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 ()

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top