2013-09-21 12 views
5

Ho un QVBoxLayout all'interno di un scrollArea. Aggiungo dinamicamente QFormLayout s.Elimina tutti i bambini da QVBoxLayout

widgetTreeStruct* tree = new widgetTreeStruct(QString::number(numberOfGraphs)); 
QFormLayout* layout = tree->getTree(); // get QFormLayout 
ui->verticalLayout_2->addLayout(layout); //add to the vertical layout 

A un certo punto ho bisogno di rimuovere tutti i aggiunto QFormLayouts dal QVBoxLayout.

Ho provato diversi modi per farlo.

  1. Utilizzando qDeleteAll()

qDeleteAll(ui->verticalLayout_2->children());

voce 2.delete uno per uno

QLayoutItem* child; 
      while((child = ui->verticalLayout_2->takeAt(0)) != 0) 
      { 
       if(child->widget() != 0) 
       { 
        delete child->widget(); 
       } 

       delete child; 
      } 

Ma non è successo niente. L'unica cosa è che quando provo ad aggiungere elementi a QVBoxLayout, vengono aggiunti nuovi elementi in cima agli elementi aggiunti in precedenza.

After added items to QVBoxLayout

Sento che devo ridisegnare, ridisegnare, aggiornare, aggiornare o qualcosa del genere. Ho provato ui->verticalLayout_2->update(); ma non ha funzionato per me.

Quindi, cosa dovrei fare?

risposta

7

Ho cancellato in modo ricorsivo tutti i bambini e ha funzionato per me.

Questo è il mio codice.

void Widget::remove(QLayout* layout) 
{ 
    QLayoutItem* child; 
    while(layout->count()!=0) 
    { 
     child = layout->takeAt(0); 
     if(child->layout() != 0) 
     { 
      remove(child->layout()); 
     } 
     else if(child->widget() != 0) 
     { 
      delete child->widget(); 
     } 

     delete child; 
    } 
} 

remove(ui->verticalLayout_2); 
+0

Questo è, in effetti, * il * modo corretto di farlo. +1 –

1

Probabilmente il genitore dei widget è il widget contenente, non il loro layout (cosa viene passato ai loro costruttori per il parametro parent?).

Forse QObject::dumpObjectTree() può aiutarti a capire le relazioni genitore-figlio.

Cosa succede con il tuo approccio 2 (che non si basa sui widget che sono figli nel QObject - senso del layout) è che rimuove tutti gli elementi dal layout con il metodo takeAt() ma non elimina nessuno di loro: I bambini del tuo numero massimo QVBoxLayout sono i QFormLayout s, quindi chiamare widget() sul loro QLayoutItems restituisce 0. Basta usare delete child incondizionatamente per eliminare il bambino QLayout s. Tuttavia, questo non cancella ancora il bambino widget. È possibile chiamare ricorsivamente takeAt() nei layout figlio o eliminare tutti i figli del widget parent (il proprio QScrollArea) o mantenere un elenco di widget e/o layout.

+0

Quando provo eliminare tutti i bambini da 'QVBoxLayout' e aggiungere un altro widget per' QVBoxLayout' ancora una volta, posso vedere appare il nuovo widget in cima ai widget precedenti. Questo mostra che i widget sono in realtà figli di 'QVBobLayout' e in realtà sono stati eliminati. Destra? Ma l'unica cosa è che devono essere cancellati o nascosti dalla finestra. Perfavore, correggimi se sbaglio. –

+0

Non vengono cancellati, solo rimossi dal layout a causa dell'uso di 'widget()'. Vedi la mia modifica sopra. – Oberon

Problemi correlati