2011-09-23 16 views

risposta

13

Basta usare

delete layout; 

come si farebbe con qualsiasi altro puntatore è stato creato utilizzando new. La risposta di

12

Chris Wilson è corretto, ma ho trovato il layout non elimina sublayouts e qwidgets sotto di esso. È meglio farlo manualmente se si hanno layout complicati o si può avere una perdita di 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

Credo che questo non sia corretto perché eliminerà i bambini e i sottofinestri se si passa il genitore nel proprio costruttore. – Goombert

3

Voglio rimuovere il layout corrente, sostituirlo con un nuovo layout, ma mantenere tutti i widget gestiti dal layout. Ho scoperto che in questo caso, la soluzione di Chris Wilson non funziona bene. Il layout non è sempre cambiato.

questo ha funzionato per me:

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

È necessario eliminare l'elemento; dopo il layout-> removeItem (item); o avrai perdite di memoria nel tuo programma. Controlla la risposta perden. – Borzh

0

So che questa domanda è vecchio e ha risposto, ma: Dal QtAlgorithms offre qDelteAll, è possibile eliminare un layout, compresa la cancellazione di tutti i suoi figli con uno -liner.

Questa è una repuplication del testo che ho postato qui: https://stackoverflow.com/a/35751235/3292513

Questo codice cancella la disposizione, tutti i suoi figli e tutto dentro il layout 'scompare'.

qDeleteAll(yourWidget->children()); 

Ecco la descrizione della funzione overload:

vuoto qDeleteAll (ForwardIterator inizio, fine ForwardIterator)

Elimina tutti gli elementi nell'intervallo [inizio, fine] utilizzando il C++ cancella> operatore. Il tipo di elemento deve essere un tipo di puntatore (ad esempio, QWidget *).

Si noti che qDeleteAll deve essere alimentato con un contenitore da quel widget (non quel layout). E nota che qDeleteAll NON elimina yourWidget - solo i suoi figli.

Ora un nuovo layout può essere regolato.

Problemi correlati