Tengo un widget que cambia cuando se alterna una opción. Esto invalida todos los diseños y widgets. Sigo lista de todos los diseños, por lo que puede eliminarlas con algo similar a this answer:reemplazando el diseño en un QWidget con otro diseño
class MyWidget(QFrame):
# ...
def reLayout(self):
def deleteLayoutChilds(l):
while l.count():
item=l.takeAt(0)
widget=item.widget()
if widget: widget.deleteLater()
else: deleteLayoutChilds(item.layout())
for l in self.allLayouts: deleteLayoutChilds(l)
# now install the new layout
##
## how to delete the old layout first?
l=self.layout(); del l # no effect
#
layout=QGridLayout(self)
## warning: QLayout: Attempting to add QLayout "" to MyWidget "", which already has a layout.
¿Cómo puedo deshacerme del antiguo trazado y establecer el nuevo?
La documentación es quite terse y al parecer no es directamente aplicable a Python:
QWidget.setLayout (auto, QLayout)
El argumento QLayout tiene su propiedad transferida a Qt.
Establece el administrador de diseño para este widget en el diseño.
Si ya hay un administrador de diseño instalado en este widget, QWidget no le permitirá instalar otro. Primero debe eliminar el administrador de diseño de existente (devuelto por el diseño()) antes de que pueda llamar a setLayout() con el nuevo diseño.
Si el diseño es el administrador de diseño en un widget diferente, setLayout() será reparará el diseño y lo convertirá en el administrador de diseño para este widget.
Ejemplo:
QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(formWidget); setLayout(layout);
Una alternativa a llamar a esta función es pasar este widget para el constructor de la disposición .
El QWidget se hará cargo de la distribución.
Consulte también el diseño() y la Gestión de diseños.
+1 para el 'QObjectCleanupHandler()' solución para eliminar el diseño . – astrojuanlu