python中side什么意思_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不会总是自动重新分配它。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值