# PyQt中,未被引用的对象将被立即释放,而被引用的对象不能直接被删除
# 所以如果需要删除对象,解除对象引用即可
import sys
from PyQt5.Qt import *
class Window(QWidget):
def __init__(self):
super().__init__()
self.setup_ui()
def setup_ui(self):
self.setWindowTitle("Qt桌面应用程序")
self.resize(300, 300)
def label_release_test_1():
# label因为没有被引用,所以创建后立即就被自动释放了
label = QLabel()
label.setText("你好,世界!")
label.show()
label.destroyed.connect(lambda: print("label被释放了"))
def label_release_test_2():
# label因为有父控件,所以创建后不会被自动释放
label = QLabel(self)
label.setText("你好,世界!")
label.show()
label.destroyed.connect(lambda: print("label被释放了"))
# del只会将label变量名删除,变量名所引用的变量因为被父控件引用,所以变量不会被删除
# del label
# print(label)
# 将label的父控件设置为None,label因为不再被引用,所以立即就被释放了
# label.setParent(None)
# deleteLater方法可以直接在下一个主循环删除label
# label.deleteLater()
def label_release_test_3():
# label因为是class Window的实例属性,存在被引用的情况,所以创建后不会被自动释放
self.label = QLabel()
self.label.setText("你好,世界!")
self.label.show()
self.label.destroyed.connect(lambda: print("label被释放了"))
# 将label从class Window的实例属性中删除,label因为不再被引用,所以立即就被释放了
del self.label
# label_release_test_1()
# label_release_test_2()
label_release_test_3()
if __name__ == '__main__':
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())