layout.addWidget(widget)
gibi bir şeye çok sayıda özel pencere öğesi eklediğim bir düzen var. Daha sonra tüm bu özel widget'ları kaldırmak ve yenilerini eklemek istiyorum. deleteLater
ve setParent(None)
söz konusu olduğunda bunu yapmanın en iyi yolu konusunda kafam karıştı. Ben tüm bu satırların gereci tarafından kullanılan düzgün temizleme bellek ihtiyaç olduğunu bir şüphe varPyQt4 setParent vs deleteLater
def _removeFilterWidgetFromLayout(self, widget):
"""Remove filter widget"""
self._collection_layout.removeWidget(widget)
widget.setParent(None)
widget.deleteLater()
: Örneğin, burada düzende tüm widget'lar için deniyor benim temizleme fonksiyonu var. Ben C++ ve Python referansları ile olanların widget
referansından emin değilim.
PyQt'deki QObjects için C++ ve Python başvuruları hakkında anladığım şey.
Bir forma bir widget eklediğinizde, widget'ın düzenin alt öğesi haline geldiğine inanıyorum. Yani, removeWidget
'u çağırırsam, üst ilişki bozuk olur, bu nedenle C++ ve Python başvurusunu kendim de başka bir üst öğe olmadığı için kendim temizlemem gerekir. setParent
numaralı çağrı, ana ilişkiyi düzen ile kaldırmanın açık bir yoludur. deleteLater
numaralı çağrı, C++ referansına dikkat çekmek içindir.
widget
değişkeni kapsam dışında kaldığından ve widget
işaret eden başka bir Python nesnesi olmadığından Python başvurusu çöp toplanır.
setParent
ve deleteLater
numaralı telefonu arayabilir miyim veya deleteLater
bunu düzgün şekilde temizlemek için yeterli olur mu?
Bir yan not olarak, bu senaryoda setParent(None)
numaralı telefonun aranmasının çok pahalı bir işlev çağrısı olduğunu buldum. Bu temizleme mesajını kaldırarak tüm temizleme sürecimi hızlandırabilirim. Her şeyi doğru şekilde temizlemek için deleteLater
'un yeterli olup olmadığından emin değilim. İşte benim profil çıkışı line_profiler
geliyor:
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()
PyQt4 kullanarak bu temizlik yapmak için bir 'kabul' yolu var mı? setParent
, deleteLater
veya her ikisini de kullanmalı mıyım? Muhtemelen