Hola usuario de nuestra web, hemos encontrado la respuesta a tu búsqueda, desplázate y la verás más abajo.
Solución:
Depende de lo que entiendas por “necesario”.
Una aplicación podría potencialmente consume mucha memoria si (por ejemplo) no se tiene cuidado al cerrar los widgets. Las clases basadas en QObject están diseñadas para vincularse (opcionalmente) en una jerarquía. Cuando se elimina un objeto de nivel superior, Qt también eliminará automáticamente todos sus objetos secundarios. Sin embargo, al cerrar widgets (que son subclases de QObject), la eliminación automática solo ocurrirá si Qt.WA_DeleteOnClose attribute está configurado (que, de forma predeterminada, generalmente no lo está).
Para ilustrar, intente abrir y cerrar repetidamente el cuadro de diálogo en este script de demostración y observe cómo crece la lista global de objetos:
import sys
from PyQt5 import QtCore, QtWidgets
class Window(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.checkbox = QtWidgets.QCheckBox('Delete')
self.button = QtWidgets.QPushButton('Open', self)
self.button.clicked.connect(self.openDialog)
layout = QtWidgets.QHBoxLayout(self)
layout.addWidget(self.checkbox)
layout.addWidget(self.button)
def openDialog(self):
widget = QtWidgets.QDialog(self)
if (self.checkbox.isChecked() and
not widget.testAttribute(QtCore.Qt.WA_DeleteOnClose)):
widget.setAttribute(QtCore.Qt.WA_DeleteOnClose)
for child in self.findChildren(QtWidgets.QDialog):
if child is not widget:
child.deleteLater()
label = QtWidgets.QLabel(widget)
button = QtWidgets.QPushButton('Close', widget)
button.clicked.connect(widget.close)
layout = QtWidgets.QVBoxLayout(widget)
layout.addWidget(label)
layout.addWidget(button)
objects = self.findChildren(QtCore.QObject)
label.setText('Objects = %d' % len(objects))
print(objects)
widget.show()
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
window = Window()
window.setGeometry(500, 300, 100, 50)
window.show()
sys.exit(app.exec_())
Con PyQt/PySide, hay dos aspectos en la propiedad del objeto: la parte de Python y la parte de Qt. A menudo, eliminar la última referencia de Python a un objeto no será suficiente para limpiarlo por completo, ya que aún podría haber una referencia retenida en el lado de Qt.
En general, Qt tiende no para eliminar implícitamente objetos. Entonces, si su aplicación crea y elimina muchos QObjects (o abre y cierra muchos QWidgets), usted mayo debe tomar medidas para eliminarlos explícitamente si el uso de la memoria es una preocupación.
ACTUALIZAR:
Solo para agregar a los puntos anteriores sobre la propiedad del objeto. A veces, es posible mantener una referencia de Python a un objeto, mientras que la parte de Qt se elimina. Cuando esto suceda, verá un error como este:
RuntimeError: se eliminó el objeto C/C++ subyacente
Por lo general, la documentación de Qt dará algunas pistas sobre cuándo podría suceder esto. Por ejemplo, QAbstractItemView.setModel da esta advertencia:
La vista no toma posesión del modelo a menos que sea el objeto principal del modelo…
Esto le dice que debe mantener una referencia de Python al objeto o pasar un objeto principal adecuado al constructor del objeto, porque Qt no siempre lo volverá a generar automáticamente.
Una aplicación de deleteLater
puede limpiarse usted mismo, es decir, programar una eliminación de un QObject (por ejemplo, en subprocesos) para liberar recursos desde dentro del propio objeto.
Aquí, por ejemplo, alguien lo está usando en relación con la señal thread.finished. Sin embargo, podría estar restringido a casos con mucha señalización.
Nos puedes añadir valor a nuestra información cooperando tu experiencia en las aclaraciones.