PySide6中QMdiArea拖拽QMdiSubWindow出现残影卡顿问题求助
PySide6 QMdiArea拖拽子窗口残留残影、卡顿问题修复方案
核心问题诱因
你的代码存在两处逻辑错误直接触发了该故障:
- 子窗口尚未添加到QMdiArea时就提前调用了
show()方法,打乱了QMdiArea内置的渲染调度逻辑,导致绘制层级异常 - 子窗口添加到QMdiArea完成后直接清空了持有子窗口引用的
subwindow_dict,Python端无有效引用的子窗口对象会被垃圾回收机制销毁,Qt端残留无效渲染节点,最终引发残影、操作卡顿问题
修复步骤
- 移除子窗口创建阶段的
show()调用,子窗口的显示逻辑交由QMdiArea统一调度,或在全部添加完成后统一控制 - 保留
subwindow_dict作为MainWindow的实例属性长期持有子窗口引用,不要在添加完成后清空 - (可选优化)为QMdiArea设置全视口更新模式,避免复杂场景下局部更新残留问题
修正后核心代码示例
from PySide6.QtWidgets import QMdiArea # 确保导入对应类 class MainWindow(QMainWindow): def __init__(self): super().__init__() self.ui = Ui_MainWindow() self.ui.setupUi(self) # 可选优化:设置全视口更新模式 self.ui.mdiArea.setViewportUpdateMode(QMdiArea.FullViewportUpdate) # 子窗口引用字典改为实例属性长期持有 self.subwindow_dict = {} self.initialize_subwindows() self.ui.mdiArea.tileSubWindows() def initialize_subwindows(self): self.create_build_overview_subwindow() self.create_object_properties_subwindow() for window in self.subwindow_dict.values(): self.ui.mdiArea.addSubWindow(window) # 移除清空字典的操作 # self.subwindow_dict.clear() def create_build_overview_subwindow(self): build_overview_window = QMdiSubWindow() build_overview_window.setWindowTitle('Build Overview') # 移除提前调用的show() # build_overview_window.show() self.subwindow_dict.update({'build_overview':build_overview_window}) def create_object_properties_subwindow(self): object_properties_window = QMdiSubWindow() object_properties_window.setWindowTitle('Object Properties') # 移除提前调用的show() # object_properties_window.show() self.subwindow_dict.update({'object_properties':object_properties_window})
修改完成后运行即可解决残影和卡顿问题。
内容的提问来源于stack exchange,提问作者JacobianFunction
相关产品推荐
相关产品推荐

