usar tutorial interfaz grafica español ejemplos creator como qt layout widget qt4

tutorial - Acerca de eliminar, eliminar widgets y diseños en Qt 4



qt tutorial español (2)

(Yo uso Qt 4.7, Windows 7, 64 bits).

Creé una tabla personalizada. Cada fila es un diseño horizontal con widgets. Las filas se guardan en una QList para facilitar el acceso, y los niños también. Las filas también se agregan dentro del widget principal.

Si cambio el tamaño del widget principal, calculo los nuevos tamaños, elimino todo y lo vuelvo a crear.

Mi problema es que no quiero eliminar ningún widget. Solo cuando borro la mesa, lo hago.

Como tengo los widgets dentro de una QList y dentro de los diseños principales, ¿cómo puedo eliminar todos los widgets en cada fila, eliminar todos los diseños y luego agregarlos a los nuevos diseños?

Si lo hago: takeAt (0) para cada elemento dentro de cada diseño, tengo un QLayoutItem con un widget dentro ... ¿Cómo puedo eliminar el layoutItem sin eliminar el widget? ... ¿Cómo elimino el widget sin matarlo? no importa si está en el padre o el niño? Porque hay muchos métodos para eliminar: removeItem, removeWidget ... en un diseño, pero no takeWidget ... simplemente tomeAt () y le da un Qlayoutitem.

Intenté varias maneras, pero todavía veo los widgets sin importar lo que les haya pasado.

Preguntas sobre esto:

  • ¿Cuándo se borra un widget? Si tomoWidget (índice) desde un diseño, ¿se borrará algún tiempo por sí mismo? ¿sucede si tengo un puntero en otra lista?

  • removeAt (index) ejecuta el método de eliminación de un widget?


Un widget en Qt es un objeto normal de C ++ y se puede eliminar con el operador de delete C ++ como cualquier otro objeto:

delete myWidget;

En Qt siempre hay una relación padre-hijo entre widgets. Cuando se destruye el widget padre, eliminará todos sus elementos secundarios. Por lo general, no necesita pensar en eliminar explícitamente ningún widgets, sino los widgets de nivel superior, es decir, ventanas y cuadros de diálogo. Qt se encargará de eliminar cualquier widgets infantil.

QList::removeAt(int) no elimina el objeto que se elimina, solo elimina el objeto de la lista. Si también quieres eliminar el objeto, deberías hacer algo como:

delete myList.takeAt(0);

Esto se aplica a todas las funciones como removeAt(int) , takeAt(int) , takeFirst() , etc. Nunca eliminan objetos, solo los eliminan del contenedor (list, layout, scrollarea, etc.). En la mayoría de los casos, la propiedad del widget se transfiere a la persona que llama, (la persona que llama se vuelve responsable de eliminar el widget a medida que se rompe la relación padre-hijo), pero no asuma que siempre es así, siempre lea la documentación de la función .


De acuerdo. Lo tengo funcionando. Déjame explicarte cómo funciona esta eliminación, mantenimiento de widgets.

Un widget es conocido por su diseño principal. Y lo eliminas a través del diseño. Haciendo:

layout()->removeAt(widget); delete widget;

Si usa takeAt (índice) en QLayout (o sus hijos), le da un QLayoutItem. Para acceder al widget en su interior, simplemente use widget (). Pero no hay forma de eliminar el widget sin eliminarlo. Entonces este enfoque no es válido.

En los Documentos, dice una forma de eliminar los elementos:

QLayoutItem *child; while ((child = layout->takeAt(0)) != 0) { ... delete child; }

Una cosa especial a tener en cuenta en Qt es la siguiente: si tiene un árbol jerárquico de diseños , agregado con addLayout () dentro de diseños, no importa qué tan profundo se inserte su widget, puede eliminarlo de los diseños secundarios o de cualquiera de los padres diseños, si la ruta del árbol desde el diseño y este elemento se crea a partir de diseños secundarios.

Lo más fácil es mantener una lista de punteros a todos los elementos, en una tabla personalizada. Cuando borre la tabla para reconstruirla, solo haga esto dentro de su widget:

CustomTableItem* item; while ( !items_.isEmpty() && ( (item = items_.takeFirst()) != 0 ) ){ layout()->removeWidget(item); delete item; // It works no matter where the item is } items_.clear(); // clear the list afterwards.

Y funciona perfectamente, también actualiza el diseño por sí mismo. Si desea conservar los elementos, simplemente omita el "elemento eliminar"; y utilícelos después.

Una cosa importante a tener en cuenta es que diferentes funciones de "eliminar" funcionan de manera diferente (como lo entiendo en Qt Docs) en QList o widgets similares, y en QLayout. En la QList, removeAt realmente elimina el objeto.

(Qt 4.7 QList Docs) "Elimina el elemento en la posición de índice i. Debo ser una posición de índice válida en la lista (es decir, 0 <= i <tamaño ())".

En un QLayout, removeWidget o removeItem no elimina el elemento / widget, usted tiene la responsabilidad de eliminarlo, como lo hice antes.

(Qt 4.7 QLayout Docs) "Elimina el widget de widgets del diseño. Después de esta llamada, es responsabilidad del comunicante dar al widget una geometría razonable o volver a colocar el widget en un diseño".

Espero eso ayude. Si ve algún error, puede decirme y edito la respuesta.

Más sobre eliminar aquí: Otra publicación de