Qt - Löschen Sie alle widgets, die aus einem QWidget-layout
Ich habe eine QWidget
in einen dialog. Im Laufe des Programms ausgeführt wird, werden mehrere QCheckBox *
Objekte Hinzugefügt werden, um das layout so:
QCheckBox *c = new QCheckBox("Checkbox text");
ui->myWidget->layout()->addWidget(c);
Dies funktioniert gut für alle Checkboxen. Allerdings habe ich auch eine QPushButton
als "klar" in meinem Dialogfeld, das, wenn Sie gedrückt wird, sollte leer alles aus myWidget, leer lassen, wie es war, bevor die QCheckboxes
Hinzugefügt wurden. Ich habe auf der Suche rund um online und in den docs, aber ich habe Probleme bei der Suche nach einem Weg, dies zu tun. Ich fand diese Frage, die ich dachte, war ähnlich wie mein problem, und habe versucht, Ihre Lösung wie diese:
void myClass::on_clear_clicked()
{
while(ui->myWidget->layout()->count() > 0)
{
QLayoutItem *item = ui->myWidget->layout()->takeAt(0);
delete item;
}
}
Dieser jedoch schien nicht, etwas zu tun. Es ist erwähnenswert, dass ich bin mir nicht sicher, ob dies ist übersetzt aus seiner Antwort richtig, es war ein bisschen unklar, wie die Funktion implementiert werden sollte, so machte ich also meine beste Vermutung. Wenn jemand weiß, was ich ändern kann, in den oben zu machen, damit es funktioniert (oder nur eine andere Möglichkeit, die funktionieren würde), wäre es sehr geschätzt werden.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die wunderbare Sache über layouts ist, dass Sie mit einer Löschung des widgets automatisch. Also alles, was Sie wirklich brauchen, ist die Iteration über die widgets und du bist fertig. Da Sie zurücksetzen möchten sich alle Kinder von einem bestimmten widget, einfach tun:
Sich keine Gedanken über layouts überhaupt. Dies funktioniert unabhängig davon, ob die Kinder konnten mit einem layout-oder nicht.
Wenn Sie wollen, um es wirklich korrekt ist, müssten Sie ignorieren die widgets, das sind die child-widgets, sondern sind stand-alone-windows. Dies wäre der Fall, wenn dies in den Allgemeinen
library-code:
Alternativ, wenn Sie nur wollen, löschen Sie die Kinder, geleitet von einem vorgegebenen layout und seine sublayouts:
Können Sie versuchen, diese:
item->widget()
gültig ist und auch es vorzuziehen ist, rufen Sie das ObjektdeleteLater
im Gegensatz zu gerade zu löschen es. Einfach patch Zeile mitif (auto widget = item->widget()) widget->deleteLater();
delete
definiert hat, Verhalten, wenn Sie übergeben einen null-Zeiger - es tut sich nichts. Es ist gut, zu löschen widgets immer, es sei denn, dieser code ist in einem slot wird aufgerufen, aus dem widget und es nutzt die widget-Kontext (d.h.this
).Q_ASSERT(sender() != item->widget() || ! sender())
- so vermeiden Sie schwer zu Debuggen Probleme durch löschen einer sender-widget. Es ist viel einfacher zu fail hard-in einem solchen Fall. Es werden keine Auswirkungen auf die Leistung im release-builds.Gegeben, dass Sie haben eine widget-Hierarchie, bestehend aus kaskadierten layouts mit widgets, dann sollten Sie besser gehen Sie für die folgenden.
Schritt 1: Löschen Sie alle widgets
Schritt 2: Löschen Sie alle layouts
Nach Schritt 2 Ihre MYTOPWIDGET sollte sauber sein.