QGroupBox odświeżanie, kasowanie zawartego Layout-a

0

Witam

Jak usunąć, zresetować, wyczyścić zawartość QGroupBox i wczytać nową ?
Mam jakiś QFormLayout
QFormLayout * lo = new QFormLayout();
Teraz uzupełniam go pewną zawartością. Niech będzie:

for(int i = 0 ; i < 10 ; i++)
        {
            form->addRow(new QLabel("Nr. "+QString::number(i)+": ") , new QLineEdit());
        }

Ładuje do QGroupBox

QGroupBox *gb = new QGroupBox();
gb->setLayout(form);

No i mam oczekiwany efekt. Następnie potrzebuje zresetować zawartość QFormLayout. Postanowiłem, że skasuje ten obiekt i stworzę go na nowo, o tak:

 //jakaś funkcja czyszcząca i definiująca na nowo zawartość form 
    delete form;
    form = new QFormLayout(gbbutton);
for(int i = 0 ; i < 15 ; i++) // teraz 15 zamiast 10 jak wyżej
        {
            form->addRow(new QLabel("Nr. "+QString::number(i)+": ") , new QLineEdit());
        }
    gb->setLayout(form);

Logicznie, rzecz biorąc powinno być tak, że pojawi mi się GroupBox z nowym Qformlayout i pojawia się. Tyle, nowy form jest, nałożony na stary (widać, że czcionka się pogrubia). Wygląda to jakby QGroupBox trzymał w pamięci poprzednią wersję form i zamiast ją skasować po linijce delete form, nakłada jedną na drugą, w efekcie otrzymuje jakby 3D QGroupBox :) Jak to rozwiązać ?

0

Nie deletuj samodzielnie obiektów z rodziny QObject. Użyj do tego rodzica i slotu deleteLater. Możesz bardziej elegancko to zrobić używając metody removeItem z QFormLayout.

Powinno zadziałać, ale ręki nie dam sobie obciąć xD

0

Podziałało coś innego. Rezultat optyczny osiągnięty w 100% jednak, programowo nie jest tak do końca.
bfield - kontener z obiektami klasy dziedziczącej po QPushButton, dodatkowo zawiera label;

form->removeWidget(bfield[i]);
        form->removeWidget(bfield[i]->label);
        bfield[i]->deleteLater();
        bfield[i]->label->deleteLater();

Obiekty znikają z layout, ale sam QFormLayout w swoich zasobach posiada historyczną ilość obiektów. Czyli jeśli najpierw chcemy 5 , później 7 , a jeszcze później 3 to QFormLayout ma po funkcji rowCount() zwróci 15;

0

przejrzyj sobie to. U mnie działa. Wycieków pamęci nie powinno być, bo Qt jest tak zbudowane żeby ładnie samo się sobą zarządzało a do tego valgrind nie pokazuje żadnych wycieków :). Mam nadzieję, że o takie coś chodziło. Funkcja main wygląda standardowo :)

http://pastebin.com/Pfz6zkb1
http://pastebin.com/3mpjctE9

0

Dokumentacja twoim przyjacielem (qt ma bardzo dobrą): http://qt-project.org/doc/qt-5/qwidget.html#setLayout
Ergo raz ustawiony layout na widget'cie jest już nie do wygryzienia (twój kod z początku nie zadziała) - można po prostu zrobić delete na layoucie i ustawić nowy, ale po co, lepiej operować na istniejącym.
W logach masz na 100% odpowiednie ostrzeżenie.

Poza tym wygląda na to, że robisz funkcjonalność QTableView lub QListView.

1 użytkowników online, w tym zalogowanych: 0, gości: 1