2024-05-20 14:37:08 发布
网友
由于Python中已经有一个垃圾收集器,那么在PyQt/PySide中是否需要deleteLater()呢?
这取决于你所说的“必要”是什么意思。
如果(例如)在关闭小部件时不小心,应用程序可能会消耗大量内存。基于QObject的类被设计为(可选地)在层次结构中链接在一起。删除顶级对象时,Qt也会自动删除其所有子对象。但是,当关闭小部件(它们是QObject的子类)时,只有在设置了Qt.WA_DeleteOnClose属性(默认情况下,通常不是这样)时才会自动删除。
要演示,请尝试在此演示脚本中反复打开和关闭对话框,并观察全局对象列表的增长情况:
from PyQt4 import QtCore, QtGui class Window(QtGui.QWidget): def __init__(self): QtGui.QWidget.__init__(self) self.checkbox = QtGui.QCheckBox('Delete') self.button = QtGui.QPushButton('Open', self) self.button.clicked.connect(self.openDialog) layout = QtGui.QHBoxLayout(self) layout.addWidget(self.checkbox) layout.addWidget(self.button) def openDialog(self): widget = QtGui.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(QtGui.QDialog): if child is not widget: child.deleteLater() label = QtGui.QLabel(widget) button = QtGui.QPushButton('Close', widget) button.clicked.connect(widget.close) layout = QtGui.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__': import sys app = QtGui.QApplication(sys.argv) window = Window() window.setGeometry(500, 300, 100, 50) window.show() sys.exit(app.exec_())
使用PyQt/PySide,对象所有权有两个方面:Python部分和Qt部分。通常,删除对某个对象的最后一个Python引用不足以完全清除,因为Qt端可能仍然保留有一个引用。
一般来说,Qt倾向于而不是隐式删除对象。因此,如果您的应用程序创建和删除了许多qobject(或打开和关闭了许多qwidget),那么如果考虑内存使用情况,您可能需要采取步骤显式删除它们。
更新:
只是为了增加上面关于对象所有权的观点。有时,当Qt部分被删除时,可以保存对对象的Python引用。发生这种情况时,您将看到如下错误:
RuntimeError: underlying C/C++ object has been deleted
通常,Qt文档会给出一些提示,说明何时可能发生这种情况。例如,QAbstractItemView.setModel发出以下警告:
The view does not take ownership of the model unless it is the model's parent object...
这告诉您必须保留对该对象的Python引用,或者将适当的父对象传递给该对象的构造函数,因为Qt不会总是自动重新分配它。
deleteLater的一个应用程序可以清理您自己,即调度QObject的删除(例如在线程中),以从对象本身释放资源。
deleteLater
这里是example有人使用它来连接信号线程。已完成。不过,它可能仅限于信号量大的情况。
这取决于你所说的“必要”是什么意思。
如果(例如)在关闭小部件时不小心,应用程序可能会消耗大量内存。基于QObject的类被设计为(可选地)在层次结构中链接在一起。删除顶级对象时,Qt也会自动删除其所有子对象。但是,当关闭小部件(它们是QObject的子类)时,只有在设置了Qt.WA_DeleteOnClose属性(默认情况下,通常不是这样)时才会自动删除。
要演示,请尝试在此演示脚本中反复打开和关闭对话框,并观察全局对象列表的增长情况:
使用PyQt/PySide,对象所有权有两个方面:Python部分和Qt部分。通常,删除对某个对象的最后一个Python引用不足以完全清除,因为Qt端可能仍然保留有一个引用。
一般来说,Qt倾向于而不是隐式删除对象。因此,如果您的应用程序创建和删除了许多qobject(或打开和关闭了许多qwidget),那么如果考虑内存使用情况,您可能需要采取步骤显式删除它们。
更新:
只是为了增加上面关于对象所有权的观点。有时,当Qt部分被删除时,可以保存对对象的Python引用。发生这种情况时,您将看到如下错误:
通常,Qt文档会给出一些提示,说明何时可能发生这种情况。例如,QAbstractItemView.setModel发出以下警告:
这告诉您必须保留对该对象的Python引用,或者将适当的父对象传递给该对象的构造函数,因为Qt不会总是自动重新分配它。
deleteLater
的一个应用程序可以清理您自己,即调度QObject的删除(例如在线程中),以从对象本身释放资源。这里是example有人使用它来连接信号线程。已完成。不过,它可能仅限于信号量大的情况。
相关问题 更多 >
编程相关推荐