2011-09-23 20 views

Respuesta

13

Usted sólo tiene que utilizar

delete layout; 

como lo haría con cualquier otro puntero que creó mediante new. La respuesta de

12

Chris Wilson es correcta, pero he encontrado la disposición no elimina sublayouts y qwidgets debajo de ella. Lo mejor es hacerlo manualmente si tiene diseños complicados o puede tener una pérdida de memoria.

QLayout * layout = new QWhateverLayout(); 

// ... create complicated layout ... 

// completely delete layout and sublayouts 
QLayoutItem * item; 
QLayout * sublayout; 
QWidget * widget; 
while ((item = layout->takeAt(0))) { 
    if ((sublayout = item->layout()) != 0) {/* do the same for sublayout*/} 
    else if ((widget = item->widget()) != 0) {widget->hide(); delete widget;} 
    else {delete item;} 
} 

// then finally 
delete layout; 
+0

Creo que esto es incorrecto porque eliminará los elementos secundarios y secundarios si pasa el elemento primario en su constructor. – Goombert

3

Quiero eliminar el diseño actual, reemplazarlo por un nuevo diseño pero mantener todos los widgets administrados por el diseño. Descubrí que en este caso, la solución de Chris Wilson no funciona bien. El diseño no siempre se cambia.

Esto funcionó para mí:

void RemoveLayout (QWidget* widget) 
{ 
    QLayout* layout = widget->layout(); 
    if (layout != 0) 
    { 
    QLayoutItem *item; 
    while ((item = layout->takeAt(0)) != 0) 
     layout->removeItem (item); 
    delete layout; 
    } 
} 
+0

Debería eliminar el artículo; después del diseño-> removeItem (item); o tendrá pérdidas de memoria en su programa. Mira la respuesta de Perden. – Borzh

0

Sé que esta pregunta es viejo y respondió, pero: Desde QtAlgorithms ofrece qDelteAll, es posible eliminar un diseño, incluyendo la eliminación de todos sus hijos con una -transatlántico.

Esta es una repuplication del texto que he publicado aquí: https://stackoverflow.com/a/35751235/3292513

Este código elimina la disposición, todos sus hijos y todo dentro del diseño 'desaparece'.

qDeleteAll(yourWidget->children()); 

Aquí está la descripción de la función sobrecargada:

void qDeleteAll (ForwardIterator comenzar, terminar ForwardIterator)

Borra todos los elementos en el rango [comenzar, terminar] utilizando el C++ eliminar> operador. El tipo de elemento debe ser un tipo de puntero (por ejemplo, QWidget *).

Tenga en cuenta que qDeleteAll necesita alimentarse con un contenedor de ese widget (no ese diseño). Y tenga en cuenta que qDeleteAll NO elimina yourWidget - solo sus hijos.

ahora un nuevo diseño se puede ajustar.

Cuestiones relacionadas