深入理解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 参数使用。

相关推荐
我叫小白菜几秒前
【Java_EE】单例模式、阻塞队列、线程池、定时器
java·开发语言
狐凄7 分钟前
Python实例题:基于 Python 的简单聊天机器人
开发语言·python
weixin_446122461 小时前
JAVA内存区域划分
java·开发语言·redis
悦悦子a啊1 小时前
Python之--基本知识
开发语言·前端·python
QuantumStack2 小时前
【C++ 真题】P1104 生日
开发语言·c++·算法
天若有情6732 小时前
01_软件卓越之道:功能性与需求满足
c++·软件工程·软件
whoarethenext2 小时前
使用 C++/OpenCV 和 MFCC 构建双重认证智能门禁系统
开发语言·c++·opencv·mfcc
代码的奴隶(艾伦·耶格尔)3 小时前
后端快捷代码
java·开发语言
Jay_5153 小时前
C++多态与虚函数详解:从入门到精通
开发语言·c++
路来了3 小时前
Python小工具之PDF合并
开发语言·windows·python