Extracción widget personalizado de QVBoxLayout
Pregunta
Tengo un QFrame con un QVBoxLayout y yo estoy añadiendo mis propios widgets personalizados para el diseño para simular un QListWidget pero con más información / funcionalidad en los artículos. Añado el widget a la disposición y mantener una referencia en una variable miembro (esto es Python):
self.sv_widgets[purchase.id] = widget
self.vl_seatView.addWidget(widget)
A continuación, cuando he terminado con un artículo que quiero para quitarlo de la pantalla y limpiar la referencia:
self.vl_seatView.removeWidget(self.sv_widgets[purchase.id])
del self.sv_widgets[purchase.id]
Por desgracia, el widget se sigue mostrando en la pantalla! He comprobado y yo sólo estoy añadiendo a la disposición una vez (y de hecho sólo se muestra una copia), intentado manualmente llamando a update () en el diseño, pero fue en vano. ¿Cuál es la forma correcta de hacer esto?
Solución
Usted puede hacer esto:
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)
explícitamente llama al destructor en el objeto correspondiente C ++. removeWidget
no causa este destructor que se llama (todavía tiene un padres en ese momento) y del
sólo marca el Python objeto para la recolección de basura.
Puede conseguir el mismo mediante la práctica (además probablemente más limpio):
self.vl_seatView.removeWidget(self.sv_widgets[purchase.id])
self.sv_widgets[purchase.id].setParent(None)
del self.sv_widgets[purchase.id]
Otros consejos
También puede utilizar self.sv_widgets [purchase.id] .deleteLater ()