PySide6 窗口生命周期:show、close、hide、事件、窗口标志 WindowFlags

前言
窗口有一套完整的生命周期:对象实例化 → 准备显示 → 显示 → 隐藏 → 关闭 → 对象销毁。同时配套 show() / hide() / close() 三个核心方法,以及窗口标志 Qt.WindowFlags 控制窗口样式(有无标题栏、是否置顶、弹窗样式等)。
show() 显示、hide() 隐藏、close() 关闭。
本文会区分逻辑隐藏和真正关闭销毁,讲解关键事件,附可直接运行的代码。
重点区分(高频混淆)
hide():隐藏窗口,对象还在内存,随时可以show()再次打开close():尝试关闭窗口,会触发关闭事件,不一定销毁对象show():显示窗口,不会新建对象
窗口生命周期

__init__:构造函数,只是创建窗口对象,窗口不会显示show():绘制并展示窗口,触发showEventhide():窗口从屏幕消失,内存对象保留,触发hideEventclose():发送关闭请求,进入closeEvent,这里可以拦截关闭动作Qt.WA_DeleteOnClose属性:关键开关- 默认:False,close 后只是 hide,对象还在,可以再次 show
- 设置 True:close 被接受之后,销毁窗口对象
通过一个示例完整说明窗口的生命周期:以 Dialog 为例,主窗口左侧为文本区域,显示事件过程,右侧为按钮区域,演示事件操作。
| |

WindowFlags 窗口标志(Qt.WindowFlags)
setWindowFlags(flags) 用来控制窗口样式:标题栏、最大化最小化按钮、弹窗样式、置顶、无边框等。
结构说明:
WindowFlags本质是一个IntFlag,由两部分按位或组成:
- 低位(0x0 ~ 0xff):
WindowType窗口类型,决定窗口"属于哪一种"- 高位(0x100 及以上):
WindowHint窗口提示,逐位控制具体外观/行为
窗口类型 WindowType(低位,决定窗口类别)
| 常量 | 值 | 含义 |
|---|---|---|
Qt.Widget | 0x0 | 普通控件/子控件,不是顶层窗口(默认) |
Qt.Window | 0x1 | 独立顶层窗口,带标题栏与边框,可移动 |
Qt.Dialog | 0x3 | 对话框窗口(= Window | Dialog),一般无最大化/最小化按钮 |
Qt.Sheet | 0x5 | macOS 工作表(Sheet),从父窗口顶沿滑出的模态窗 |
Qt.Drawer | 0x7 | macOS 抽屉窗口,从父窗口侧边滑出 |
Qt.Popup | 0x9 | 弹出式窗口(无标题栏、立即夺焦点),如菜单/下拉 |
Qt.Tool | 0xb | 工具窗口,小标题栏,任务栏不显示图标 |
Qt.ToolTip | 0xd | 工具提示窗口,无标题栏、不接收焦点,一闪即过 |
Qt.SplashScreen | 0xf | 启动闪屏窗口(无边框,通常位于屏幕中央) |
Qt.Desktop | 0x11 | 桌面窗口(覆盖整个桌面,很少直接用) |
Qt.SubWindow | 0x12 | 子窗口(用于 MDI 多文档界面的内部子窗口) |
Qt.ForeignWindow | 0x21 | 包装外部系统窗口的句柄(嵌入其他进程窗口) |
Qt.CoverWindow | 0x41 | 覆盖窗口,被其他窗口遮挡时也保留绘制缓冲 |
Qt.WindowType_Mask | 0xff | 类型掩码,用于按位提取窗口类型部分 |
窗口提示标志 WindowHint(高位,逐位控制外观/行为)
| 常量 | 值 | 含义 |
|---|---|---|
Qt.MSWindowsFixedSizeDialogHint | 0x100 | Windows:对话框固定大小,禁止拖动边框调整 |
Qt.MSWindowsOwnDC | 0x200 | Windows:为控件分配独立的设备上下文(DC) |
Qt.BypassWindowManagerHint | 0x400 | 绕过窗口管理器(WM)直接管理 |
Qt.X11BypassWindowManagerHint | 0x400 | X11:绕过窗口管理器(与上值相同) |
Qt.FramelessWindowHint | 0x800 | 无边框窗口,没有标题栏、边框、按钮 |
Qt.WindowTitleHint | 0x1000 | 显示标题栏 |
Qt.WindowSystemMenuHint | 0x2000 | 显示系统菜单(标题栏左侧菜单) |
Qt.WindowMinimizeButtonHint | 0x4000 | 显示最小化按钮 |
Qt.WindowMaximizeButtonHint | 0x8000 | 显示最大化按钮 |
Qt.WindowMinMaxButtonsHint | 0xc000 | 同时显示最小化 + 最大化按钮 |
Qt.WindowContextHelpButtonHint | 0x10000 | 显示上下文帮助按钮("?") |
Qt.WindowShadeButtonHint | 0x20000 | 显示卷起/隐藏(Shade)按钮 |
Qt.WindowStaysOnTopHint | 0x40000 | 窗口置顶,永远在最上层 |
Qt.WindowTransparentForInput | 0x80000 | 窗口对鼠标输入透明(穿透,不接收鼠标事件) |
Qt.WindowOverridesSystemGestures | 0x100000 | 覆盖系统手势(如触控板/多点触控) |
Qt.WindowDoesNotAcceptFocus | 0x200000 | 窗口不接收键盘焦点 |
Qt.ExpandedClientAreaHint | 0x400000 | Windows:客户区扩展到系统按钮周围 |
Qt.MaximizeUsingFullscreenGeometryHint | 0x400000 | macOS:最大化时使用全屏几何(与上同值) |
Qt.NoTitleBarBackgroundHint | 0x800000 | macOS:标题栏不绘制背景(透明) |
Qt.CustomizeWindowHint | 0x2000000 | 自定义窗口,关闭标准标题栏装饰 |
Qt.WindowStaysOnBottomHint | 0x4000000 | 窗口置底,永远在最下层 |
Qt.WindowCloseButtonHint | 0x8000000 | 显示关闭按钮 |
Qt.MacWindowToolBarButtonHint | 0x10000000 | macOS:标题栏工具栏按钮(统一标题栏) |
Qt.BypassGraphicsProxyWidget | 0x20000000 | 绕过图形代理控件(Graphics Proxy) |
Qt.NoDropShadowWindowHint | 0x40000000 | 禁用窗口投影(阴影) |
Qt.WindowFullscreenButtonHint | 0x80000000 | 显示全屏按钮 |
低位标识与高位标识搭配使用,如下代码:
| |