Ver Mensaje Individual
  #2 (permalink)  
Antiguo 27/03/2015, 06:35
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: Qt. Borrar el contenido de un Widget de forma efectiva

QWidget tiene un sistema de borrado automático. Este mecanismo funciona de la siguiente forma: Cuando se elimina un QWidget, todos sus QWidget hijos son eliminados también.

Si borras un QWidget de forma manual, este widget se desligará de su widget "parent" antes de borrarse, de forma que el padre no se queda con punteros no válidos.

Fíjate en el detalle, un QWidget puede depender, o no, de otro QWidget... la gracia de esto es que un QLayout no hereda de QWidget, luego el padre de un QWidget no puede ser nunca un QLayout... sí puedes insertar un QWidget en un layout... pero esa acción no modifica la relación "parent".

Dicho esto, si tu tienes QWidget(1)->QLayout->QWidget(2) y borras QWidget(2), te vas a quedar con QWidget(1)->QLayout, y claro, Qt te dice que a un widget que ya tiene layout no puedes asignarle otro (aquí el segundo error ).

Sin embargo, si borras el layout, verás que éste no borra los widgets contenidos en el mismo (ojo, si los quita de la ventana... pero estos objetos siguen vivos)... así como tampoco eliminará sublayouts... te tendrás que encargar de eso de forma explícita so pena de quedarte con lagunas de memoria.

Con todo, dado que "Datos" es un widget, lo que uno esperaría encontrar es, bien un diseño realizado con el QtDesigner, o bien un código que trate de una composición de widgets que únicamente afecte al widget en cuestión y no al padre... ese "mainLayout" es como un puñetazo en la cara porque estás tocando la composición del padre... estás rompiendo toda la encapsulación con una sola línea.

Un Widget debe preocuparse únicamente de "su" contenido, no del contenido del padre.

Si, por contra, "Datos" no es un widget, no sería tampoco recomendable dejar a este widget la responsabilidad de manipular el layout principal del padre... ya que eso te limita a que el widget padre únicamente pueda contener la composición indicada en "Datos"... para eso haz la composición directamente en el padre y olvídate de "Datos".

Un saludo.