深入理解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() 设置窗口类型和行为。

cpp 复制代码
    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 using
        ForeignWindow = 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 参数使用。

相关推荐
小糯米6011 小时前
JavaScript表达式与运算符
开发语言·javascript·ecmascript
北极星日淘1 小时前
煤炉自动代拍功能开发 | Python 异步任务实现批量下单
开发语言·python·自动化
极客BIM工作室1 小时前
OCCT gp_Trsf 三维变换类深度剖析:经典设计与底层陷阱
c++
体验家1 小时前
体验家 XMPlus 网页端问卷 SDK 技术解析:用几行 JavaScript 实现精准场景触发与防打扰机制
开发语言·前端·javascript
二十七剑1 小时前
LangGraph 源码深度解析:Node 节点 Protocol 与 StateNodeSpec 核心机制
开发语言·python
AC赳赳老秦1 小时前
OpenClaw + 云数据库运维:自动备份、扩容、迁移 RDS/MySQL 云数据库
运维·开发语言·数据库·人工智能·python·mysql·openclaw
醉城夜风~1 小时前
类和对象III
开发语言·c++
冷小鱼1 小时前
高级研发编码习惯:从规范到艺术,再到AI+时代的人机协同
java·开发语言·python·编码习惯
fox_lht2 小时前
15.4.循环和迭代器的性能比较
开发语言·后端·学习·rust
小鹿软件办公2 小时前
倒计时开启:Chromium 宣布几周内将全面切断 MV2 扩展支持
开发语言·javascript·ublock origin