Zum löschen, entfernen von widgets und layouts in Qt 4
(Ich benutze Qt 4.7, Windows 7, 64bit).
Erstellte ich eine benutzerdefinierte Tabelle. Jede Zeile ist ein horizontales layout mit widgets.
Die Zeilen sind gehalten, in einem QList für den einfachen Zugriff und die Kinder auch. Die Zeilen werden auch Hinzugefügt, die innerhalb des übergeordneten widgets.
Wenn ich die Größe der parent-widget, berechne ich die neuen Größen, alles löschen, neu erstellen und wieder.
Mein problem ist, dass ich nicht wollen, zu löschen, widget. Nur, wenn ich den Tisch abräumen, ich mache es.
Da habe ich die widgets in ein QList und innerhalb des parent-layouts, Wie kann ich entfernen Sie alle widgets in jeder Zeile, löschen Sie alle layouts, und klicken Sie dann fügen Sie diese in Ihre neue layouts?
Wenn ich das Tue: takeAt(0) für jedes element in jedem layout habe ich ein QLayoutItem mit einem widget drinnen... Wie kann ich löschen die layoutItem löschen, ohne das widget?.... Wie kann ich das widget entfernen ohne es zu töten, egal ob es die Eltern oder das Kind? Denn es gibt viele Methoden für das löschen von: removeItem, removeWidget... in einem layout, aber nicht takeWidget... nur takeAt() und es gibt eine Qlayoutitem.
Versuchte ich mehrere Möglichkeiten, aber ich sehe immer noch die widgets-egal, was Ihnen passiert ist.
Fragen dazu:
- Wann wird ein widget gelöscht? Wenn ich takeWidget(index) aus einem layout, wird es gelöscht einiger Zeit von selbst? passiert es, wenn ich einen Zeiger darauf in einer anderen Liste?
- removeAt(index) tut, führen die delete-Methode der widget?
InformationsquelleAutor darkgaze | 2013-07-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ok. Ich habe es funktioniert.
Lassen Sie mich erklären, wie das Entfernen von, halten, widgets funktioniert.
Widget ist bekannt durch seine Eltern-layout. Und entfernen Sie es durch das layout. By doing:
Wenn Sie takeAt(index) in ein QLayout (oder seine Kinder), es gibt Ihnen ein QLayoutItem. Um auf die widget-innen, nutzen Sie einfach das widget(). Aber es gibt keinen Weg, um das widget entfernen, ohne Sie zu löschen. Dieser Ansatz ist nicht gültig.
In der Dokumentation erzählt es eine Möglichkeit zum löschen der Elemente:
Einer speziellen Sache zu beachten, in der Qt ist die folgende:
Wenn Sie eine Hierarchie von layouts, Hinzugefügt mit addLayout() innen-layouts, egal wie tief Ihr widget eingefügt wird, können Sie es entfernen, aus dem Kind layouts oder übergeordneten layouts, wenn der Baum Weg von der layout-und dieser Punkt wurde von Kind layouts.
Ist die einfachste Sache zu halten, ist eine Liste von Zeigern auf alle Elemente, die in einer benutzerdefinierten Tabelle. Beim löschen der Tabelle zu rekonstruieren, sondern nur in Ihrem widget:
Und es funktioniert perfekt, aktualisiert das layout auch von selbst.
Wenn Sie möchten, halten Sie die Elemente, überspringen Sie einfach die "Element löschen", und verwenden Sie Sie anschließend.
Eine wichtige Sache zu beachten ist, dass verschiedenen "entfernen" - Funktionen arbeiten anders (so wie ich das verstehe auf die Qt-Doku) in QList oder ähnlichen widgets, und in QLayout.
In der QList, removeAt entfernt tatsächlich das Objekt.
In QLayout, removeWidget oder removeItem entfernen Sie nicht die Element/widget, haben Sie die Verantwortung, es zu löschen, wie ich es Tat, bevor.
Hoffe, es hilft. Wenn Sie einen Fehler sehen, könnten Sie mir sagen und ich passe die Antwort!
Mehr auf das löschen von hier:
Andere stackoverflow-post
Das ist auch das, was Sie tun können, um entfernen Sie ein widget aus einem layout löschen, OHNE es. Wenn Sie nicht über die widget-Zeiger, tun Sie den folgenden: QLayoutItem * item = layout->itemAt(0); QWidget * widget = item->widget(); if (widget != NULL) { layout->removeWidget(widget); //wenn Sie löschen möchten Sie das widget machen: widget->setParent(NULL); löschen von widget; } (Formatierung funktioniert nicht, aber Sie bekommen die Idee...)
Zur info: Dies ist nicht gültig in Python-da müssen Sie kümmern sich um die internen c++ - Objekt zu .
Wenn das Element muss vernichtet werden, die aus einem event-handler (slot), ist es notwendig, rufen Sie Objekt->deleteLater() wie gezeigt in den "sonstigen posten"., ansonsten wird eine heap-Beschädigung auftreten.
InformationsquelleAutor
Eines widgets in Qt ist eine normale C++ - Objekt kann gelöscht werden mit der C++
delete
Betreiber wie jedes andere Objekt:In Qt gibt es immer ein Eltern-Kind-Beziehung zwischen den widgets. Wenn das Eltern-widget zerstört wird, löscht es alle Ihre Kinder. In der Regel werden Sie nicht brauchen, um darüber nachzudenken explizit löschen, alle widgets, aber die top-level-widgets, d.h., Fenstern und Dialogen. Qt wird sich darum kümmern, löschen alle Kind-widgets.
QList::removeAt(int)
löscht nicht das Objekt, das entfernt wird, die nur entfernt das Objekt aus der Liste. Wenn Sie auch möchten, löschen Sie das Objekt, das Sie tun müsste, wäre so etwas wie:Dies gilt für alle Funktionen wie
removeAt(int)
,takeAt(int)
,takeFirst()
usw. Sie niemals Objekte löschen, die Sie nur entfernen Sie Sie aus dem container (Liste, layout, scrollarea, etc). In den meisten Fällen das Eigentum an dem widget wird dann an den Anrufer (der Anrufer wird verantwortlich für das löschen des widget, wie die Eltern-Kind-Beziehung bricht), aber nicht davon ausgehen, ist dies immer der Fall ist, Lesen Sie immer die Dokumentation der Funktion.FYI, Dies ist nicht gültig in Python. Sie kümmern sich um die internen c++ - Objekt zu.
InformationsquelleAutor