You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 11:15:05