1、内存管理机制
第一种情况:obj1会自动被释放,obj2绑在obj1上,所以obj1被释放之后,obj2也会被释放;程序结束,自动释放内存,所以obj1被自动释放掉了。
def manage_memory(self):
obj1 = QObject()
obj2 = QObject()
obj2.setParent(obj1)
# 监听obj2对像被释放
obj2.destroyed.connect(lambda : print("obj2对象被释放了"))
第二种情况,obj1不会被释放掉,将obj1作为self对象的属性。
def manage_memory(self):
obj1 = QObject()
# 将obj1作为self对象的属性,
# 相当于有指针指向obj1对像,所以不会被自动释放
self.obj1 = obj1
obj2 = QObject()
obj2.setParent(obj1)
# 监听obj2对像被释放
obj2.destroyed.connect(lambda : print("obj2对象被释放了"))
第③种情况:将self.obj1释放掉,它对应的子对象也会被自动释放。
def manage_memory(self):
obj1 = QObject()
# 将obj1作为self对象的属性,
# 相当于有指针指向obj1对像,所以不会被自动释放
self.obj1 = obj1
obj2 = QObject()
obj2.setParent(obj1)
# 监听obj2对像被释放
obj2.destroyed.connect(lambda : print("obj2对象被释放了"))
del self.obj1
即:当父对象被释放,子对象也会被自动释放。
2、将内存管理机制应用于QWidget种:
父子对象的操作应用场景:
案例:
案例1:显示父子控件的关系
if __name__ == "__main__":
app = QApplication(sys.argv)
# window = Window()
# window.show()
win1 = QWidget()
win1.setWindowTitle("红色")
win1.setStyleSheet("background-color: red")
win1.show()
win2 = QWidget()
win2.setWindowTitle("绿色")
win2.setStyleSheet("background-color: green")
#win2.setParent(win1)
win2.resize(100, 100)
win2.show()
sys.exit(app.exec_())
案例2:
if __name__ == "__main__":
app = QApplication(sys.argv)
win_root = QWidget()
label1 = QLabel()
label1.setText("label1")
label1.setParent(win_root)
btn = QPushButton(win_root)
btn.move(100, 100)
btn.setText("btn")
win_root.show()
sys.exit(app.exec_())
案例3:
if __name__ == "__main__":
app = QApplication(sys.argv)
win_root = QWidget()
label1 = QLabel()
label1.setText("label1")
label1.setParent(win_root)
label2 = QLabel()
label2.move(50, 50)
label2.setText("label2")
label2.setParent(win_root)
label3 = QLabel()
label3.move(80, 80)
label3.setText("label1")
label3.setParent(win_root)
btn = QPushButton(win_root)
btn.move(100, 100)
btn.setText("btn")
win_root.show()
# 遍历win_root中所有的子控件
for sub_widget in win_root.findChildren(QLabel):
print(sub_widget)
sub_widget.setStyleSheet("background-color:cyan;")
sys.exit(app.exec_())