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?

Foi útil?

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 ()

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top