Rimozione widget personalizzato da QVBoxLayout
Domanda
Ho un QFrame con un QVBoxLayout e sto aggiungendo i miei widget personalizzati per il layout per simulare un QListWidget ma con più informazioni / funzionalità nelle voci. Aggiungo il widget per il layout e mantenere un riferimento in una variabile membro (questo è Python):
self.sv_widgets[purchase.id] = widget
self.vl_seatView.addWidget(widget)
Poi, quando ho finito con un elemento che voglio per rimuoverlo dallo schermo e ripulire il riferimento:
self.vl_seatView.removeWidget(self.sv_widgets[purchase.id])
del self.sv_widgets[purchase.id]
Purtroppo, il widget è ancora visualizzato sullo schermo! Ho controllato e sto solo aggiungerlo al layout una volta (e in effetti viene visualizzata una sola copia), provato manualmente chiamando update () sul layout, ma senza alcun risultato. Qual è il modo giusto per fare questo?
Soluzione
Si può fare questo:
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)
esplicitamente invita il distruttore per l'oggetto corrispondente C ++. removeWidget
non causa questo distruttore di essere chiamato (ancora ha un genitore a quel punto) e del
segna solo l'oggetto Python per la raccolta dei rifiuti.
È possibile ottenere lo stesso facendo (riordinata più pulito):
self.vl_seatView.removeWidget(self.sv_widgets[purchase.id])
self.sv_widgets[purchase.id].setParent(None)
del self.sv_widgets[purchase.id]
Altri suggerimenti
È inoltre possibile utilizzare self.sv_widgets [purchase.id] .deleteLater ()