Ist deleteLater () in PyQt / PySide notwendig?

8

Da es in Python bereits einen Garbage Collector gibt, ist deleteLater () in PyQt / PySide notwendig?

    
iMath 23.11.2013, 15:16
quelle

2 Antworten

12

Es hängt davon ab, was Sie mit "notwendig" meinen.

Eine Anwendung könnte potenziell viel Speicher belegen, wenn zum Beispiel Widgets nicht geschlossen werden. Die QObject-basierten Klassen sind (optional) in einer Hierarchie miteinander verknüpft. Wenn ein Objekt der obersten Ebene gelöscht wird, löscht Qt automatisch alle untergeordneten Objekte. Beim Schließen von Widgets (die Unterklassen von QObject sind) wird die automatische Löschung jedoch nur ausgeführt, wenn Qt.WA_DeleteOnClose -Attribut gesetzt ist (was normalerweise nicht der Fall ist).

Um dies zu veranschaulichen, versuchen Sie wiederholt, den Dialog in diesem Demoskript zu öffnen und zu schließen und beobachten Sie, wie die globale Liste von Objekten wächst:

%Vor%

Bei PyQt / PySide gibt es zwei Aspekte für die Objektverantwortung: den Python-Teil und den Qt-Teil. Oft reicht das Entfernen des letzten Python-Verweises auf ein Objekt nicht aus, um vollständig zu bereinigen, da auf der Qt-Seite immer noch ein Verweis vorhanden sein könnte.

Im Allgemeinen neigt Qt nicht dazu, Objekte zu löschen. Wenn Ihre Anwendung also viele QObjects erstellt und entfernt (oder viele QWidgets öffnet und schließt), müssen Sie möglicherweise Schritte unternehmen, um sie explizit zu löschen, wenn die Speicherbelegung ein Problem darstellt.

AKTUALISIEREN :

Nur um die obigen Punkte zum Objektbesitz hinzuzufügen. Manchmal ist es möglich, einen Python-Verweis auf ein Objekt zu halten, während der Qt-Teil gelöscht wird. In diesem Fall wird ein Fehler wie dieser angezeigt:

  

RuntimeError: das zugrundeliegende C / C ++ Objekt wurde gelöscht

Normalerweise wird die Qt-Dokumentation einige Hinweise geben, wann dies passieren könnte. Zum Beispiel gibt QAbstractItemView.setModel folgende Warnung aus:

  

Die Ansicht übernimmt das Modell nicht, es sei denn, es handelt sich um das übergeordnete Objekt des Modells ...

Dies sagt Ihnen, dass Sie entweder einen Python-Verweis auf das Objekt beibehalten müssen oder ein passendes Elternobjekt an den Konstruktor des Objekts übergeben müssen, da Qt es nicht immer automatisch neu parst.

    
ekhumoro 23.11.2013, 20:26
quelle
0

Eine Anwendung von deleteLater kann das Aufräumen von Ihnen selbst sein, d. h. das Planen eines Löschens eines QObjects (zum Beispiel beim Threading), um Ressourcen aus dem Objekt selbst freizugeben.

Hier für Beispiel benutzt jemand es in Verbindung mit dem Signal thread.finished. Es könnte jedoch auf Fälle mit starker Signalisierung beschränkt sein.

    
Trilarion 20.05.2014 14:11
quelle

Tags und Links