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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top