Suppression d'un widget personnalisé à partir QVBoxLayout
Question
J'ai un QFrame avec un QVBoxLayout et j'ajouter mes propres widgets personnalisés à la mise en page pour simuler un QListWidget mais avec plus d'informations / fonctionnalité dans les articles. Ajouter le widget à la mise en page et de conserver une référence dans une variable membre (ce qui est Python):
self.sv_widgets[purchase.id] = widget
self.vl_seatView.addWidget(widget)
Puis, quand je suis fait avec un article que je veux retirer de l'écran et nettoyer la référence:
self.vl_seatView.removeWidget(self.sv_widgets[purchase.id])
del self.sv_widgets[purchase.id]
Malheureusement, le widget est toujours affiché à l'écran! J'ai vérifié et je ne l'ajouter à la disposition une fois (et en fait une seule copie est affichée), essayé d'appeler manuellement la mise à jour () sur la mise en page, mais en vain. Quelle est la bonne façon de le faire?
La solution
Vous pouvez faire ceci:
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)
explicitement appelle le destructeur de l'objet C ++ correspondant. removeWidget
ne provoque pas ce destructor à appeler (il encore a une mère à ce moment) et del
marque seulement l'objet python pour la collecte des ordures.
Vous pouvez obtenir le même en faisant (propably plus propre):
self.vl_seatView.removeWidget(self.sv_widgets[purchase.id])
self.sv_widgets[purchase.id].setParent(None)
del self.sv_widgets[purchase.id]
Autres conseils
Vous pouvez également utiliser self.sv_widgets [purchase.id] .deleteLater ()