PyQt5中MDI子窗口按钮消失且setWindowFlags不生效问题
解决PyQt5 MDI子窗口最大化时按钮异常及setWindowFlags不生效问题
问题原因
- 窗口标志设置逻辑错误:直接将
QMdiSubWindow的窗口标志替换为Qt.Window会破坏MDI子窗口的默认适配规则,QMdiSubWindow有专门适配MDI环境的默认标志,强行覆盖会导致MDI区域无法正确管理子窗口的标题栏与按钮。 - 最大化时的控件整合异常:MDI子窗口最大化时,其标题栏控件会被MDI区域整合,若窗口标志设置不当,会引发按钮位置偏移、隐藏的问题。
修复方案
修改subWindowCreation方法,基于QMdiSubWindow的默认窗口标志追加所需按钮标志,而非直接覆盖,并调整设置顺序:
def subWindowCreation(self, windowRef, subWindowTitle): try: sub_window = QMdiSubWindow() # 获取默认窗口标志,追加需要的按钮提示 default_flags = sub_window.windowFlags() sub_window.setWindowFlags(default_flags | Qt.WindowMinimizeButtonHint | Qt.WindowMaximizeButtonHint | Qt.WindowCloseButtonHint) sub_window.setWidget(windowRef) sub_window.resize(windowRef.width(), windowRef.height()) sub_window.setWindowTitle(subWindowTitle) sub_window.setAttribute(Qt.WA_DeleteOnClose) self.ui.mdiMainWindow.addSubWindow(sub_window) sub_window.show() except Exception as e: QMessageBox.about(self, 'Exception', 'Error: "{}"'.format(e))
关键说明
- 保留默认标志:
QMdiSubWindow的默认标志包含Qt.SubWindow等MDI适配属性,直接替换为Qt.Window会让子窗口脱离MDI管理逻辑,引发显示异常。 - 调整设置顺序:窗口标志需在
setWidget之前设置,否则部分属性无法正确应用到子窗口。 - 按钮显示修复:修改后,子窗口最大化时,按钮会正常显示在对应位置,不会出现边缘隐藏的情况。
内容的提问来源于stack exchange,提问作者Arun Agarwal
相关产品推荐
相关产品推荐

