考虑以下类:
class Page(QObject):
def __init__(self, parent=None):
super().__init__(parent)
self.wdg = QWidget()
...请问,当Page的实例被deleteLater()并删除时,self.wdg是否会自动删除?
一般会认为,“会”。当Page的实例被删除时,self.wdg.__del__会被调用,self.wdg会被删除。
然而,实际上,self.wdg并不会被删除。调用self.wdg.__del__并不会顺带调用self.wdg.deleteLater(),因此self.wdg并不会被删除。
那如何让self.wdg在Page被删除时自动删除呢?
我们考虑将self.wdg绑定到Page自身,即:
class Page(QObject):
def __init__(self, parent=None):
super().__init__(parent)
self.wdg = QWidget(self)
...这样,当Page的实例被删除时,self.wdg也会被删除。
无需担心self.wdg的父级问题。即便self.wdg在界面上绑定别的控件,都不会更改self.wdg的父级。
具体而言,PySide,更具体的,Qt,对象销毁是基于树的。当树根被删除时,整棵树都会被删除。因此,当Page的实例被删除时,self.wdg也会被删除。
同时,一个控件在绑定到布局时:
- 如果没设置父级,则父级自动为布局的父级。
- 如果设置了父级,则父级不变。
也就是说,绑定的父级优先级比布局父级更高,它能“显式”的改变删除顺序,使其符合预期。