深入理解Qt的SetWindowsFlags函数
深入理解Qt的SetWindowsFlags函数
我们接下来来仔细了解一下Qt当中一个非常重要的函数:SetWindowsFlags。
void QWidget::setWindowFlags(Qt::WindowFlags flags)
setWindowFlags()
用于设置窗口的系统标志,这些标志决定了窗口如何与窗口管理器交互以及它的外观表现。我们重点主要了解的是Qt::WindowFlags
- 窗口类型(type):一个窗口只能有一种类型,如
Qt::Window
,Qt::Dialog
等。 - 提示标志(hints):可以添加多个提示,如
Qt::FramelessWindowHint
,Qt::WindowStaysOnTopHint
等,用来控制窗口的显示方式和行为。 - 更改后需重新显示:调用后原窗口将被隐藏,修改后的 flags 会在下一次
show()
时生效。
这是上面这个函数一些比较重要的点。
我已为您生成完整的 enum WindowType
中文教学文档,涵盖每个枚举值的含义与用途。您可以在右侧的文档视图中阅读与编辑该文档,如需导出 PDF、添加示例代码或生成表格版对比内容,也可以继续告诉我!
WindowType
枚举详解📘
用于在 Qt 中通过 QWidget::setWindowFlags()
或 QWindow::setFlags()
设置窗口类型和行为。
enum WindowType {Widget = 0x00000000,Window = 0x00000001,Dialog = 0x00000002 | Window,Sheet = 0x00000004 | Window,Drawer = Sheet | Dialog,Popup = 0x00000008 | Window,Tool = Popup | Dialog,ToolTip = Popup | Sheet,SplashScreen = ToolTip | Dialog,Desktop = 0x00000010 | Window,SubWindow = 0x00000012, // Note QTBUG-115729 before usingForeignWindow = 0x00000020 | Window,CoverWindow = 0x00000040 | Window,WindowType_Mask = 0x000000ff,MSWindowsFixedSizeDialogHint = 0x00000100,MSWindowsOwnDC = 0x00000200,BypassWindowManagerHint = 0x00000400,X11BypassWindowManagerHint = BypassWindowManagerHint,FramelessWindowHint = 0x00000800,WindowTitleHint = 0x00001000,WindowSystemMenuHint = 0x00002000,WindowMinimizeButtonHint = 0x00004000,WindowMaximizeButtonHint = 0x00008000,WindowMinMaxButtonsHint = WindowMinimizeButtonHint | WindowMaximizeButtonHint,WindowContextHelpButtonHint = 0x00010000,WindowShadeButtonHint = 0x00020000,WindowStaysOnTopHint = 0x00040000,WindowTransparentForInput = 0x00080000,WindowOverridesSystemGestures = 0x00100000,WindowDoesNotAcceptFocus = 0x00200000,MaximizeUsingFullscreenGeometryHint = 0x00400000,CustomizeWindowHint = 0x02000000,WindowStaysOnBottomHint = 0x04000000,WindowCloseButtonHint = 0x08000000,MacWindowToolBarButtonHint = 0x10000000,BypassGraphicsProxyWidget = 0x20000000,NoDropShadowWindowHint = 0x40000000,WindowFullscreenButtonHint = 0x80000000};
一、基础窗口类型
枚举值 | 十六进制 | 说明 |
---|---|---|
Widget | 0x00000000 | 普通控件,无特殊类型。常用于嵌入式子控件。 |
Window | 0x00000001 | 独立窗口,拥有顶部标题栏和边框。 |
Dialog | 0x00000003 | 对话框类型,有独立窗口属性,适合模态/非模态对话。 |
Sheet | 0x00000005 | macOS 风格的下拉式对话,附加于窗口上方。 |
Drawer | 0x00000007 | 抽屉式面板,结合 Sheet 与 Dialog 特性。 |
Popup | 0x00000009 | 弹出式窗口,如菜单或工具提示。 |
Tool | 0x0000000B | 工具窗口,用于辅助工具浮动面板。 |
ToolTip | 0x0000000D | 工具提示窗口,支持嵌入式提示。 |
SplashScreen | 0x0000000F | 启动屏幕窗口,在应用启动时显示。 |
Desktop | 0x00000011 | 桌面窗口,覆盖整个屏幕。 |
SubWindow | 0x00000012 | 子窗口,用于多文档界面(MDI)。QTBUG-115729 注意事项。 |
ForeignWindow | 0x00000021 | 嵌入非 Qt 创建的外部窗口。 |
CoverWindow | 0x00000041 | 覆盖式窗口,如全屏遮罩层。 |
二、类型掩码
枚举值 | 十六进制 | 说明 |
---|---|---|
WindowType_Mask | 0x000000ff | 提取窗口基本类型所用掩码。 |
三、Windows 特定提示
枚举值 | 十六进制 | 说明 |
---|---|---|
MSWindowsFixedSizeDialogHint | 0x00000100 | 固定大小的对话框,不可调整。 |
MSWindowsOwnDC | 0x00000200 | 独立的设备上下文(HDC)。 |
BypassWindowManagerHint | 0x00000400 | 绕过窗口管理器,由应用控制窗口。 |
X11BypassWindowManagerHint | 0x00000400 | 在 X11 下作用等同于上。 |
四、标题栏/边框控制
枚举值 | 十六进制 | 说明 |
---|---|---|
FramelessWindowHint | 0x00000800 | 无边框窗口,适合自定义界面。 |
WindowTitleHint | 0x00001000 | 显示窗口标题栏。 |
WindowSystemMenuHint | 0x00002000 | 提供窗口系统菜单。 |
WindowMinimizeButtonHint | 0x00004000 | 显示最小化按钮。 |
WindowMaximizeButtonHint | 0x00008000 | 显示最大化按钮。 |
WindowMinMaxButtonsHint | 0x0000C000 | 同时显示最大化和最小化按钮。 |
WindowContextHelpButtonHint | 0x00010000 | 显示上下文帮助按钮(问号)。 |
WindowShadeButtonHint | 0x00020000 | 显示卷帘按钮。 |
五、行为提示
枚举值 | 十六进制 | 说明 |
---|---|---|
WindowStaysOnTopHint | 0x00040000 | 窗口总在最上层。 |
WindowTransparentForInput | 0x00080000 | 不接收鼠标或键盘输入。 |
WindowOverridesSystemGestures | 0x00100000 | 覆盖系统手势(如滑动)。 |
WindowDoesNotAcceptFocus | 0x00200000 | 不接收焦点。 |
MaximizeUsingFullscreenGeometryHint | 0x00400000 | 最大化时使用全屏大小。 |
六、自定义/特殊提示
枚举值 | 十六进制 | 说明 |
---|---|---|
CustomizeWindowHint | 0x02000000 | 开启窗口自定义行为配置。 |
WindowStaysOnBottomHint | 0x04000000 | 窗口总在最底层。 |
WindowCloseButtonHint | 0x08000000 | 显示关闭按钮。 |
MacWindowToolBarButtonHint | 0x10000000 | macOS 工具栏按钮支持。 |
BypassGraphicsProxyWidget | 0x20000000 | 绕过 QGraphicsProxyWidget 限制。 |
NoDropShadowWindowHint | 0x40000000 | 去除窗口阴影。 |
WindowFullscreenButtonHint | 0x80000000 | 显示全屏切换按钮(macOS)。 |
一些提示
-
建议使用位或组合已有 flags,这样不会覆盖原有设置:
w->setWindowFlags(w->windowFlags() | Qt::FramelessWindowHint);
-
而不是直接覆盖全部 flags,避免意外丢失已有设置,保持窗口行为的正确性。
-
在某些平台(如 Windows、X11),需
show()
之后,才会看到 flags 的实际效果。 -
特定组合注意:
-
FramelessWindowHint
取消边框、标题,使窗口更灵活但可影响拖动等功能。 -
WindowStaysOnTopHint
强制置顶,不分应用可以使用户体验出现问题,需结合 parent 参数使用。