Entfernen Sie benutzerdefiniertes Widget von QVBoxLayout
Frage
Ich habe einen QFRame mit einem QVBoxLayout und füge meine eigenen benutzerdefinierten Widgets zum Layout hinzu, um ein QListwidget zu simulieren, aber mit weiteren Informationen/Funktionen in den Elementen. Ich füge das Widget zum Layout hinzu und halte eine Referenz in einer Mitgliedsvariablen (dies ist Python):
self.sv_widgets[purchase.id] = widget
self.vl_seatView.addWidget(widget)
Wenn ich dann mit einem Gegenstand fertig bin, möchte ich es vom Bildschirm entfernen und die Referenz reinigen:
self.vl_seatView.removeWidget(self.sv_widgets[purchase.id])
del self.sv_widgets[purchase.id]
Leider wird das Widget immer noch auf dem Bildschirm angezeigt! Ich habe überprüft und ich füge es nur einmal zum Layout hinzu (und tatsächlich wird nur eine Kopie angezeigt), versuchte manuell Update () im Layout, aber ohne Erfolg. Was ist der richtige Weg, dies zu tun?
Lösung
Du kannst das:
import sip # you'll need this import (no worries, it ships with your pyqt install)
sip.delete(self.sv_widgets[purchase.id])
sip.delete(obj)
explizit Ruft den Destruktor auf dem entsprechenden C ++ - Objekt auf. removeWidget
lässt diesen Destruktor nicht aufgerufen (es immer noch hat einen Elternteil an diesem Punkt) und del
markiert nur das Python Objekt für die Müllsammlung.
Sie können dasselbe erreichen, indem Sie dies tun (problemlos sauberer):
self.vl_seatView.removeWidget(self.sv_widgets[purchase.id])
self.sv_widgets[purchase.id].setParent(None)
del self.sv_widgets[purchase.id]
Andere Tipps
Sie können auch self.sv_widgets [kauf.id] .deletelater () verwenden