2013-09-21 1 views
5

Mam QVBoxLayout wewnątrz scrollArea. Dynamicznie dodajemy QFormLayout s.Usuń wszystkie dzieci z QVBoxLayout

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

W pewnym momencie muszę usunąć wszystkie dodane QFormLayouts z QVBoxLayout.

Próbowałem na kilka sposobów, aby to zrobić.

  1. Korzystanie qDeleteAll()

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

poz 2.delete jeden po drugim

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

       delete child; 
      } 

Ale nic się nie stało. Jedyną rzeczą jest, kiedy próbuję dodawać elementy do QVBoxLayout ponownie nowe elementy są dodawane do wcześniej dodanych elementów.

After added items to QVBoxLayout

czuję, że muszę przerysować, przemalować, aktualizacji, odświeżyć lub coś. Próbowałem ui->verticalLayout_2->update();, ale nie działał dla mnie.

Co powinienem zrobić?

Odpowiedz

7

Rekurencyjnie usunąłem wszystkie dzieci i zadziałało to dla mnie.

To jest mój kod.

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

Jest to * właściwy sposób wykonania tej czynności. +1 –

1

Prawdopodobnie rodzicem widżetów jest widżet zawierający , a nie ich układ (co jest przekazywane do ich konstruktorów dla parametru parent?).

Może QObject::dumpObjectTree() może pomóc w zrozumieniu relacji rodzic-dziecko.

Co dzieje się z twoim podejściem 2 (które nie polega na widgetach będących dziećmi w QObject -sense układu) polega na tym, że usuwa wszystkie elementy z układu za pomocą metody takeAt(), ale nie usuwa żadnego z nich: Dzieci twojego numeru QVBoxLayout są numerami QFormLayout s, więc wywołanie widget() na ich zwraca. Wystarczy bezwarunkowo użyć delete child, aby usunąć dziecko QLayout. Jednak to nadal nie usuwa widżetów dziecka. Można albo wywołać rekurencyjnie takeAt() w układach podrzędnych, albo usunąć wszystkie elementy podrzędne widżetu nadrzędnego (Twój QScrollArea) lub zachować listę widgetów i/lub układów samodzielnie.

+0

Kiedy próbuję usunąć wszystkie dzieci z 'QVBoxLayout' i dodać kolejny widget do' QVBoxLayout' ponownie, widzę nowy widżet pojawia się na górze poprzednich widżetów. To pokazuje, że widżety są faktycznie dziećmi 'QVBobLayout' i faktycznie zostały usunięte. Dobrze? Ale jedyne, czego potrzebują, to oczyścić lub ukryć się z okna. Proszę, popraw mnie jeśli się mylę. –

+0

Nie są one usuwane, a jedynie usuwane z układu z powodu użycia 'widget()'. Zobacz moją edycję powyżej. – Oberon