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?

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top