如何在mdiArea子窗口关闭时回收其占用的内存
问题原因
QMdiArea调用addSubWindow()方法传入自定义窗口时,会自动生成一个外层的QMdiSubWindow容器实例来包裹你的自定义窗口,你仅给内部自定义窗口设置了Qt.WA_DeleteOnClose属性,外层的容器实例没有设置该属性,关闭窗口时仅内部自定义窗口被销毁,外层容器仍残留在QMdiArea中,导致内存无法回收。你注释里提到去掉addSubWindow()行内存就能正常回收,正好印证了这个问题:没有加入QMdiArea的托管逻辑时,自定义窗口销毁后没有残留的外层容器占用内存。
修复方案
只要给addSubWindow()返回的外层QMdiSubWindow容器也设置Qt.WA_DeleteOnClose属性即可,无需额外复杂的引用管理逻辑。
关键代码修改
你只需要修改TabWidget类的insertSubWindow方法即可:
def insertSubWindow(self): sub_window = SubWindow(self) sub_window.destroyed.connect(self.removeSubWindow) self.subWindows.append(weakref.ref(sub_window, self.subWindows.remove)) # 拿到addSubWindow返回的外层容器 mdi_wrapper = self.mdiArea.addSubWindow(sub_window) # 给外层容器也设置关闭即删除属性 mdi_wrapper.setAttribute(QtCore.Qt.WA_DeleteOnClose) sub_window.show()
如果修改后还有残留的内存占用,可以在removeSubWindow方法中手动清理残留的容器实例:
def removeSubWindow(self): # 遍历所有已关闭的子窗口容器,手动移除 for wrapper in self.mdiArea.subWindowList(): if wrapper.widget() is None: self.mdiArea.removeSubWindow(wrapper) sip.delete(wrapper) print(self.mdiArea.subWindowList())
修改后重复添加、关闭子窗口,内存不会再持续增长,关闭后资源会正常回收。
内容的提问来源于stack exchange,提问作者bactone
相关产品推荐
相关产品推荐

