Removendo o widget personalizado do qvboxlayout
Pergunta
Eu tenho um QFRame com um QvBoxlayout e estou adicionando meus próprios widgets personalizados ao layout para simular um QListWidget, mas com mais informações/funcionalidade nos itens. Adicionei o widget ao layout e mantenho uma referência em uma variável de membro (este é Python):
self.sv_widgets[purchase.id] = widget
self.vl_seatView.addWidget(widget)
Então, quando terminar com um item, quero removê -lo da tela e limpar a referência:
self.vl_seatView.removeWidget(self.sv_widgets[purchase.id])
del self.sv_widgets[purchase.id]
Infelizmente, o widget ainda está sendo exibido na tela! Eu verifiquei e estou apenas adicionando -o ao layout uma vez (e de fato apenas uma cópia é exibida), tentei chamar manualmente a atualização () no layout, mas sem sucesso. Qual é a maneira certa de fazer isso?
Solução
Você consegue fazer isso:
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)
explicitamente chama o destruidor no objeto C ++ correspondente. removeWidget
não faz com que esse destruidor seja chamado (ainda tem um pai nesse ponto) e del
apenas marca o Pitão objeto para coleta de lixo.
Você pode alcançar o mesmo fazendo (propavelmente mais limpo):
self.vl_seatView.removeWidget(self.sv_widgets[purchase.id])
self.sv_widgets[purchase.id].setParent(None)
del self.sv_widgets[purchase.id]
Outras dicas
Você também pode usar self.sv_widgets [compra.id] .DeleteLater ()