PyQt / PySide中是否需要deleteLater()?

iMath

由于Python中已经存在垃圾收集器,因此PyQt / PySide中是否需要deleteLater()?

ekhumoro

这取决于您所说的“必需”。

如果(例如)关闭小部件时不小心,则应用程序可能消耗大量内存。基于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:基础C / C ++对象已被删除

通常,Qt文档会提示何时发生这种情况。例如,QAbstractItemView.setModel发出以下警告:

除非视图是模型的父对象,否则视图不拥有模型的所有权。

这是在告诉您,您必须保留对对象的Python引用,或者将合适的父对象传递给对象的构造函数,因为Qt不会总是自动将其重新父化。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在PyQt / PySide中是否需要deleteLater()?

来自分类Dev

在PyQt中,丢弃物品时是否需要断开信号?

来自分类Dev

PySide / PyQt是否可以在QTextBrowser中获取锚点的字符串

来自分类Dev

PyQt4 setParent vs DeleteLater

来自分类Dev

PYSide / PyQt Qtreewidget字体颜色

来自分类Dev

Python PyQT / PySide QThread限制

来自分类Dev

pySide / pyQt-标记栏?

来自分类Dev

pySide / pyQt-标记栏?

来自分类Dev

PySide/PyQt 覆盖小部件

来自分类Dev

PySide/PyQt:检测 QPushButton 状态?

来自分类Dev

为什么在PySide / PyQt中超级使用了很多?

来自分类Dev

访问模型中dropAction的值(PySide / PyQt / Qt)

来自分类Dev

如何在PySide / PyQt中撤消对QListWidgetItem的编辑?

来自分类Dev

在QTreeView(Qt / PySide / PyQt)中实现自动换行的委托?

来自分类Dev

Python PyQt Pyside-QFileDialog中的setNameFilters不起作用

来自分类Dev

如何在PyQt / PySide中获取QPalette的组和角色?

来自分类Dev

在Pyside / PyQt中的QWizard页面之间共享变量

来自分类Dev

相当于wxPython在PyQt / PySide中的冻结和解冻

来自分类Dev

单击QTextBrowser中的链接后,PySide / PyQt文本消失

来自分类Dev

从pyside / pyqt中的子小部件调用父方法

来自分类Dev

在Pyside / PyQt中通过http发布上传文件

来自分类Dev

单击其中的链接后,QTextBrowser中的PySide / PyQt文本消失

来自分类Dev

将setStyle应用于PySide / PyQt中的QLabel

来自分类Dev

Python PyQt Pyside-QFileDialog中的setNameFilters不起作用

来自分类Dev

如何在PySide / PyQt中撤消对QStandardItem的编辑?

来自分类Dev

pyqt中的CodeEditor示例

来自分类Dev

在pyqt中禁用QComboBox

来自分类Dev

在pyqt中显示相机

来自分类Dev

PyQt:QGridLayout 中的 setSpacing

Related 相关文章

热门标签

归档