Mam układ, do którego dodaję wiele niestandardowych widżetów z czymś takim jak layout.addWidget(widget)
. Później chcę usunąć wszystkie niestandardowe widżety i dodać nowe. Jestem zdezorientowany najlepszym sposobem, aby to zrobić, jeśli chodzi o deleteLater
i setParent(None)
. Na przykład, oto moja funkcja czyszczenia, która jest wywoływana dla wszystkich widgetów w układzie:PyQt4 setParent vs deleteLater
def _removeFilterWidgetFromLayout(self, widget):
"""Remove filter widget"""
self._collection_layout.removeWidget(widget)
widget.setParent(None)
widget.deleteLater()
Mam podejrzenie, że nie wszystkie z tych linii są potrzebne do prawidłowego oczyszczania pamięci używanej przez widget. Nie jestem pewien, co się dzieje z odwołaniami C++ i Python do widget
.
Oto, co rozumiem w odniesieniu do odwołań C++ i Python do QObjects w PyQt.
Wierzę, że po dodaniu widżetu do układu widget staje się dzieckiem układu. Tak więc, jeśli zadzwonię pod numer removeWidget
, wówczas relacja nadrzędna jest zerwana, więc muszę sam posprzątać referencje C++ i Python, ponieważ widget nie ma innego rodzica. Wywołanie funkcji setParent
jest jawnym sposobem usuwania relacji nadrzędnej z układem. Wywołanie funkcji deleteLater
służy do dbania o referencje C++.
Odwołanie do Pythona jest zbędne, ponieważ zmienna widget
wykracza poza zakres i żadne inne obiekty Pythona nie wskazują na widget
.
Czy muszę zadzwonić pod numer setParent
i deleteLater
lub czy deleteLater
będzie wystarczający do prawidłowego wyczyszczenia tego?
Na marginesie, stwierdziłem, że wywołanie setParent(None)
jest bardzo kosztownym wywołaniem funkcji w tym scenariuszu. Mogę znacznie przyspieszyć cały proces czyszczenia, usuwając to połączenie. Nie jestem pewien, czy wystarczy deleteLater
, aby wszystko poprawnie wyczyścić. Oto moje wyjście profilowanie od line_profiler
:
Line # Hits Time Per Hit % Time Line Contents
==============================================================
2167 @profile
2168 def _removeFilterWidgetFromLayout(self, widget):
2169 """Remove filter widget"""
2170
2171 233 1528 6.6 1.0 self._collection_layout.removeWidget(widget)
2172 233 143998 618.0 97.9 widget.setParent(None)
2173 233 1307 5.6 0.9 widget.deleteLater()
Podczas korzystania PyQt4 jest tam „zaakceptowane” sposób to zrobić porządki? Czy powinienem używać setParent
, deleteLater
, czy obu?