Ver Mensaje Individual
  #3 (permalink)  
Antiguo 27/03/2015, 11:35
dehm
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 14 años, 3 meses
Puntos: 10
Respuesta: Qt. Borrar el contenido de un Widget de forma efectiva

Cita:
Iniciado por eferion Ver Mensaje

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".
En un párrafo me has aclarado la duda que llevaba 2 días rumiando. Ahora entiendo mucho mejor muchas cosas que he estado viendo y trasteando desde ayer.
Cita:
Iniciado por eferion Ver Mensaje
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.
Esta parte sin embargo no me ha quedado muy clara.
Yo entiendo que tengo esto:
QWidget(1); //en el padre

Y cuando creo el objeto, en el constructor ligo el "mainlayout" al parent. Pero así ha de ser siempre, no?

mainLayout= new QVBoxLayout(parent); //el hijo

Que en definitiva me quedaría: QWidget(1)->mainLayout->QWidget(2)

Y entonces, al borrar el objeto Datos, por propagación, yo pensaba que borraría el mainLayout y de ahí para abajo, pero por lo que me dices eso no es así. Si lo he de hacer de forma manual, debería borrar los widgets que hay dentro de ese "mainLayout" y luego borrar el propio "mainLayout" ?


Cita:
Iniciado por eferion Ver Mensaje

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.
Ciertamente, toda esta historia era un apaño para reciclar la clase que he usado para hacer pruebas modelo/vista/delegado, e insertarla en un QMainWindow a martillazos.
Pero claro, cuando he estado haciendo pruebas con las tablas y los delegados y demás, he metido todo a cascoporro en una clase, la fuente de datos, los delegados, la tabla, etc...y realmente es el momento de separar los datos de los widgets y hacer las cosas algo menos peor.

Gracias como siempre!!


Edito:

Realmente no había entendido bien la segunda parte de tu explicación. Ahora sí que lo tengo claro, y ya me funciona el ejemplo.
__________________
Mi calculadora en Qt

Última edición por dehm; 29/03/2015 a las 03:39