对象删除
API
obj.deleteLater() 删除一个对象时, 也会解除它与父对象之间的关系,deleteLater()并没有将对象立即销毁,而是向主消息循环发送了一个event,下一次主消息循环收到这个event之后才会销毁对象,这样做的好处是可以在这些延迟删除的时间内完成一些操作,坏处就是内存释放会不及时。
API Dome
del 只是删除指向对象的变量,并没有删除数据。下面运行过程中OBJ对象并没有被释放,只是删除了OBJ变量,后面不能使用。
from PyQt5.Qt import *
import sys
class Window(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("QObject learning")
self.resize(500,500)
self.setup_ui()
def setup_ui(self):
self.TypeDetermine()
def TypeDetermine(self):
OBJ=QObject(self)
OBJ.destroyed.connect(lambda :print("OBJ被释放"))
del OBJ
try:
OBJ.setObjectName("test")
except:
print("OBJ不存在")
if __name__ == '__main__':
app=QApplication(sys.argv)
window=Window()
window.show()
sys.exit(app.exec())
Running result:
D:\mypython\Pyqt5learning\Scripts\python.exe D:/mypython/Pyqt5learning/Dome7.py
OBJ不存在
deleteLater可以将对象删除,但不会立即删除,下面运行结果先打印OBJ对象,后面才打印“OBJ被释放”就可以验证这点。
from PyQt5.Qt import *
import sys
class Window(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("QObject learning")
self.resize(500,500)
self.setup_ui()
def setup_ui(self):
self.TypeDetermine()
def TypeDetermine(self):
OBJ=QObject(self)
OBJ.destroyed.connect(lambda :print("OBJ被释放"))
OBJ.deleteLater()
print(OBJ)
if __name__ == '__main__':
app=QApplication(sys.argv)
window=Window()
window.show()
sys.exit(app.exec())
Running result:
D:\mypython\Pyqt5learning\Scripts\python.exe D:/mypython/Pyqt5learning/Dome7.py
<PyQt5.QtCore.QObject object at 0x00000214743BAB80>
OBJ被释放