[Qt] Det går att ta bort layouten, men går det att to bort barnen?

Permalänk
Medlem

[Qt] Det går att ta bort layouten, men går det att to bort barnen?

Hej!

Jag håller på att skriva ett program i C++, och använder Qt 4 för att skapa GUIt.

Programmet söker igenom en lista efter och jag får tillbaka en lista med ett antal resultat. Att visa resultaten fungerar bra, men ifall jag får först 2 resultat, och nästa gång 1 resultat så försvinner inte det andra resultatet. Jag har kommit fram till att det beror på att layout()->children aldrig tas bort, men vet inte hur jag ska lösa det.

Såhär ser min kod ut:

void MainWindow::DoSearch(const QString &s) { QVector<Word> result = mainDict->Search(s); delete ui->scrollAreaWidgetContents->layout(); QVBoxLayout * outerLayout = new QVBoxLayout(ui->scrollAreaWidgetContents); if(result.count() > 0) { foreach(Word w, result) { QLabel * tmpLabel = new QLabel(ui->scrollAreaWidgetContents); tmpLabel->setText(w.Navi + " - " + w.English); outerLayout->addWidget(tmpLabel, 0, Qt::AlignTop); } } outerLayout->addStretch(1); ui->scrollAreaWidgetContents->setLayout(outerLayout); ui->contentDisplay->setWidgetResizable(true); }

Kan vara värt att notera att jag aldrig har använt Qt eller C++ förut, men har varit tvungen att porta ifrån C#.NET p.g.a. multiplattformsstöd.

Permalänk
Hedersmedlem

Lättast vore väl att ha en lista med pekare till QLabel-objekten och radera dem innan man skapar nya (eller kanske bara ändra texten)?

Dokumentationen säger också:

Citat:

Note: Widgets in a layout are children of the widget on which the layout is installed, not of the layout itself. Widgets can only have other widgets as parent, not layouts.

Permalänk
Medlem

Okej,,,, problemet är ju att jag inte ens lyckas med det.

tbh så är jag så sjukt trött på allting som har med C++ och Qt att göra, men jag kommer aldrig att bli klar ifall jag aldrig gör något.

Jag försökte med det här:

mainwindow.h: [...] QList<QWidget> *childList; // Dåligt QList<QWidget *> childList; // Bra [...] mainwindow.cpp: [...] void MainWindow::DoSearch(const QString &s) { QVector<Word> result = mainDict->Search(s); foreach(QWidget *wid, childList) { delete wid; childList.removeAll(wid); } delete ui->scrollAreaWidgetContents->layout(); QVBoxLayout * outerLayout = new QVBoxLayout(ui->scrollAreaWidgetContents); if(result.count() > 0) { foreach(Word w, result) { QLabel * tmpLabel = new QLabel(ui->scrollAreaWidgetContents); tmpLabel->setText(w.Navi + " - " + w.English); outerLayout->addWidget(tmpLabel, 0, Qt::AlignTop); childList.append(tmpLabel); } } outerLayout->addStretch(1); ui->scrollAreaWidgetContents->setLayout(outerLayout); ui->contentDisplay->setWidgetResizable(true); } [...]

EDIT: Löst!

Behövde ändra definitionen av listan i mainwindow.h, se koden för lösning.

Så små fel kan ta så mycket tid