前言

上一篇文章我们剖析了 QStyle 的内核架构。这篇文章是它的「字典」——把 QStyle 中定义的每一个枚举值列出来,给出中文说明、实际使用场景和代码示例。你可以把它当作常备参考资料,写自定义 style 时对着查。

本文覆盖以下枚举体系(基于 Qt 6,同时标注 Qt 5 差异):

枚举类型 数量 用途
PixelMetric 85+ 所有像素尺寸的一口价查询
StyleHint 110+ 行为开关与风格属性
PrimitiveElement 30+ 不可再分的视觉基元
ControlElement 30+ 带语义的控件绘制
ComplexControl 10 交互式复合控件
SubElement 45+ 简单控件子部件几何
SubControl 50+ 复杂控件子控件几何
ContentsType 12 内容尺寸计算入口
StandardPixmap 30+ 标准像素图
State (QStyleOption) 15 控件状态位掩码

第一部分:PixelMetric(像素度量)— 85+ 项

PixelMetric 是 QStyle 中被调用频率最高的查询接口。它的设计哲学是:任何与像素尺寸相关的数值,都从这里获取,而不是硬编码在控件中

int QStyle::pixelMetric(PixelMetric metric,
                        const QStyleOption *option = nullptr,
                        const QWidget *widget = nullptr) const;

以下按功能分组,逐项说明。

1.1 按钮(Button)类

枚举值 含义 典型用法
PM_ButtonMargin 按钮内容(文字+图标)到按钮边框的距离 QPushButton 计算 sizeHint() 时在 contentSize 基础上加上此 margin
PM_ButtonDefaultIndicator 默认按钮(回车键对应)的额外指示边框宽度 PE_PanelButtonCommand 中绘制默认按钮的额外轮廓
PM_ButtonShiftHorizontal 按钮按下时内容水平偏移量 按钮被点击时文字/图标向右下偏移的量
PM_ButtonShiftVertical 按钮按下时内容垂直偏移量 同上,垂直方向
PM_MenuButtonIndicator 菜单按钮的下拉箭头指示器宽度 QPushButton 带菜单时显示箭头的位置和大小
PM_ButtonIconSize 按钮图标的默认尺寸 QPushButton::iconSize() 的默认值(当用户未显式设置时)
// 示例:在自定义 style 中精细控制按钮 margin
int MyStyle::pixelMetric(PixelMetric metric, const QStyleOption *opt,
                         const QWidget *w) const {
    switch (metric) {
    case PM_ButtonMargin:
        // 水平 16px,垂直通过 sizeFromContents 控制
        return 16;
    case PM_ButtonDefaultIndicator:
        return 0;  // 扁平设计,不需要额外指示器
    case PM_ButtonShiftHorizontal:
        return 0;  // 按下不位移(用颜色变化代替)
    case PM_ButtonShiftVertical:
        return 0;
    default:
        return QProxyStyle::pixelMetric(metric, opt, w);
    }
}

1.2 框架与边框(Frame / Border)类

枚举值 含义 典型用法
PM_DefaultFrameWidth 控件的默认边框宽度 QFrameQLineEditQTextEdit 等的默认边框厚度
PM_SpinBoxFrameWidth SpinBox 的边框宽度 QSpinBox / QDoubleSpinBox 的外边框
PM_ComboBoxFrameWidth ComboBox 的边框宽度 QComboBox 下拉框边框
PM_MenuPanelWidth 菜单面板的边框宽度 QMenu 弹出时外围边框厚度
PM_ToolBarFrameWidth 工具栏边框宽度 QToolBar 外围边框
PM_MenuBarPanelWidth 菜单栏面板宽度(Qt 5) QMenuBar 面板边框
// 示例:统一管理所有边框宽度
int MyStyle::pixelMetric(PixelMetric metric, ...) const {
    switch (metric) {
    case PM_DefaultFrameWidth:  return 1;  // 细边框设计
    case PM_SpinBoxFrameWidth:  return 1;
    case PM_ComboBoxFrameWidth: return 1;
    default: return QProxyStyle::pixelMetric(metric, opt, w);
    }
}

1.3 焦点矩形(Focus Rect)类

枚举值 含义 典型用法
PM_FocusFrameVMargin 焦点框距离内容区域的垂直边距 焦点矩形绘制时的垂直内缩
PM_FocusFrameHMargin 焦点框距离内容区域的水平边距 焦点矩形绘制时的水平内缩
// 示例:让焦点框稍微超出按钮边缘
int MyStyle::pixelMetric(PixelMetric metric, ...) const {
    switch (metric) {
    case PM_FocusFrameHMargin: return -2;  // 向外扩展 2px
    case PM_FocusFrameVMargin: return -2;
    default: return QProxyStyle::pixelMetric(metric, opt, w);
    }
}

1.4 滚动条(ScrollBar)类

枚举值 含义 典型用法
PM_ScrollBarExtent 滚动条的宽度(垂直条)或高度(水平条) 整体滚动条的厚度
PM_ScrollBarSliderMin 滚动条滑块的最小长度 防止内容太大时滑块缩成一个小点
PM_ScrollView_ScrollBarSpacing ScrollView 内上下/左右滚动条之间的间距 QScrollArea 两条滚动条相交处的间隙
PM_ScrollView_ScrollBarOverlap 滚动条是否叠盖内容区域(Qt 6) macOS 风格的 overlay scrollbar
// 示例:窄滚动条(现代 UI 风格)
case PM_ScrollBarExtent: return 8;
case PM_ScrollBarSliderMin: return 30;  // 滑块最小 30px

1.5 滑块(Slider)类

枚举值 含义 典型用法
PM_SliderThickness 滑块轨道的厚度 QSlider 轨道的粗细
PM_SliderControlThickness 滑块手柄的厚度 QSlider 拖动手柄的尺寸
PM_SliderLength 滑块手柄的长度(沿滑动方向) 手柄沿轨道方向的长度
PM_SliderTickmarkOffset 刻度线距离轨道的偏移 刻度标记的绘制位置
PM_SliderSpaceAvailable 滑块轨道的可用空间 轨道可滑动的有效区域
// 示例:自定义滑块外观
case PM_SliderThickness:       return 4;   // 细轨道
case PM_SliderControlThickness: return 20;  // 圆形手柄直径
case PM_SliderLength:           return 20;  // 手柄沿轨道方向 20px
case PM_SliderTickmarkOffset:   return 6;   // 刻度离轨道 6px

1.6 标签栏(TabBar)类

枚举值 含义 典型用法
PM_TabBarTabOverlap 相邻标签的重叠量 标签之间互相覆盖的像素数(让标签看起来连在一起)
PM_TabBarTabHSpace 标签内文字到标签边距的水平空间 单个标签的左右内边距
PM_TabBarTabVSpace 标签内文字到标签边距的垂直空间 单个标签的上下内边距
PM_TabBarBaseHeight 标签栏底部面板的高度 标签下方的装饰条/面板高度
PM_TabBarBaseOverlap 标签底部与标签栏面板的重叠 选中标签的底部边框与 panel 的重叠区域
PM_TabBarTabShiftHorizontal 按下标签时的水平偏移 标签被点击时的位移效果
PM_TabBarTabShiftVertical 按下标签时的垂直偏移 同上,垂直方向
PM_TabBarScrollButtonWidth 滚动按钮的宽度 标签过多时出现的左右滚动箭头按钮宽度
PM_TabBar_ScrollButtonOverlap 滚动按钮与标签的重叠(Qt 6)
// 示例:自定义标签栏间距
case PM_TabBarTabOverlap:  return 0;   // 标签不重叠
case PM_TabBarTabHSpace:   return 20;  // 标签左右宽松
case PM_TabBarTabVSpace:   return 10;  // 标签上下宽松
case PM_TabBarBaseHeight:  return 2;   // 底部细线
case PM_TabBarBaseOverlap: return 0;   // 不重叠

1.7 菜单(Menu)类

枚举值 含义 典型用法
PM_MenuHMargin 菜单项的水平边距 菜单文字到菜单边缘的距离
PM_MenuVMargin 菜单项的垂直边距 同上,垂直方向
PM_MenuBarHMargin 菜单栏的水平边距 QMenuBar 整体左右边距
PM_MenuBarVMargin 菜单栏的垂直边距 QMenuBar 整体上下边距
PM_MenuBarItemSpacing 菜单栏中项目之间的间距 QMenuBar 中各 action 项之间的水平间距
PM_MenuScrollerHeight 菜单滚动箭头的高度 菜单过长时出现的上下箭头按钮高度
PM_MenuTearoffHeight 撕下菜单"手柄"的高度 tear-off menu 的把手区域高度
PM_MenuDesktopFrameWidth 菜单阴影/桌面框架宽度 弹出菜单的外围装饰宽度
PM_MenuButtonIndicator 菜单按钮指示器尺寸 QPushButton 带菜单时的箭头尺寸
PM_SubMenuOverlap 子菜单与父菜单的重叠量 二级菜单弹出时覆盖父菜单的像素
// 示例:紧凑型菜单
case PM_MenuHMargin:          return 4;
case PM_MenuVMargin:          return 2;
case PM_MenuScrollerHeight:   return 12;
case PM_MenuTearoffHeight:    return 0;  // 禁用 tear-off
case PM_MenuDesktopFrameWidth: return 1;  // 细边框
case PM_SubMenuOverlap:       return -2; // 子菜单稍微向左偏移

1.8 工具栏(ToolBar)类

枚举值 含义 典型用法
PM_ToolBarHandleExtent 工具栏拖拽手柄的宽度/高度 左侧/上方拖拽把手区域的大小
PM_ToolBarItemMargin 工具栏中项目的外边距 ToolButton 之间的边距
PM_ToolBarItemSpacing 工具栏中项目之间的间距 ToolButton 之间的间距(不同于 margin)
PM_ToolBarSeparatorExtent 工具栏分隔符的宽度/高度 竖线分隔符的粗细
PM_ToolBarExtensionExtent “更多"扩展按钮的尺寸 工具栏折叠后的 » 展开按钮大小
PM_ToolBarIconSize 工具栏图标的默认尺寸 QToolButton::iconSize() 默认值
case PM_ToolBarHandleExtent:    return 4;   // 窄拖拽手柄
case PM_ToolBarItemMargin:      return 2;   // 紧凑间距
case PM_ToolBarItemSpacing:     return 4;
case PM_ToolBarSeparatorExtent: return 8;   // 分隔线 8px 粗细
case PM_ToolBarExtensionExtent: return 16;  // >> 按钮 16px

1.9 停靠窗口(DockWidget)类

枚举值 含义 典型用法
PM_DockWidgetSeparatorExtent 停靠窗口之间分隔条的粗细 拖动分隔条时的目标区域宽度
PM_DockWidgetTitleBarButtonMargin 标题栏按钮的边距 关闭/浮动按钮到标题边缘的距离
PM_DockWidgetTitleMargin 标题栏文字边距 标题文字到边缘的距离
PM_DockWidgetFrameWidth 停靠窗口的边框宽度 外围边框厚度
case PM_DockWidgetSeparatorExtent: return 4;
case PM_DockWidgetFrameWidth:      return 0;  // 无边框设计
case PM_DockWidgetTitleMargin:     return 8;

1.10 布局(Layout)类

枚举值 含义 典型用法
PM_LayoutLeftMargin 布局左侧外边距 对话框内容区域的左边距
PM_LayoutTopMargin 布局顶部外边距 对话框内容区域的上边距
PM_LayoutRightMargin 布局右侧外边距 对话框内容区域的右边距
PM_LayoutBottomMargin 布局底部外边距 对话框内容区域的下边距
PM_LayoutHorizontalSpacing 布局水平间距 同行控件之间的水平间距
PM_LayoutVerticalSpacing 布局垂直间距 同行控件之间的垂直间距
// 示例:统一对话框内边距
case PM_LayoutLeftMargin:   return 12;
case PM_LayoutTopMargin:    return 12;
case PM_LayoutRightMargin:  return 12;
case PM_LayoutBottomMargin: return 12;
case PM_LayoutHorizontalSpacing: return 8;
case PM_LayoutVerticalSpacing:   return 8;

1.11 图标尺寸(Icon Size)类

这些枚举定义了不同上下文下的默认图标尺寸。用户可以通过 QAbstractButton::setIconSize() 覆盖,但如果不设,就回退到这些值。

枚举值 含义 典型使用者
PM_SmallIconSize 小图标标准尺寸(通常 16×16) 列表项图标、树节点图标
PM_LargeIconSize 大图标标准尺寸(通常 32×32) 大图标视图
PM_ToolBarIconSize 工具栏图标尺寸 QToolBar
PM_ButtonIconSize 按钮图标尺寸 QPushButton
PM_MessageBoxIconSize 消息框图标尺寸 QMessageBox 的警告/信息图标
PM_ListViewIconSize 列表视图图标尺寸 QListView
PM_IconViewIconSize 图标视图图标尺寸 QListView::IconMode
// 示例:统一图标尺寸为 24px
case PM_SmallIconSize:   return 24;
case PM_LargeIconSize:   return 32;
case PM_ButtonIconSize:  return 24;
case PM_ToolBarIconSize: return 24;

1.12 指示器与勾选框(Indicator / CheckBox)类

枚举值 含义 典型用法
PM_IndicatorWidth 单选/复选指示器的宽度 checkbox 方框 / radio 圆圈的尺寸
PM_IndicatorHeight 单选/复选指示器的高度 同上(通常与宽度相同)
PM_CheckBoxLabelSpacing 复选框与标签文字之间的间距 方框右边到文字的间距
PM_RadioButtonLabelSpacing 单选框与标签文字之间的间距 圆圈右边到文字的间距
PM_ExclusiveIndicatorWidth 独占指示器宽度(Qt 5) 菜单中 radio 行为指示器宽度
PM_ExclusiveIndicatorHeight 独占指示器高度(Qt 5) 同上
// 示例:自定义复选框样式
case PM_IndicatorWidth:            return 20;
case PM_IndicatorHeight:           return 20;
case PM_CheckBoxLabelSpacing:      return 8;
case PM_RadioButtonLabelSpacing:   return 8;
case PM_ExclusiveIndicatorWidth:   return 16;
case PM_ExclusiveIndicatorHeight:  return 16;

1.13 进度条(ProgressBar)类

枚举值 含义 典型用法
PM_ProgressBarChunkWidth 进度条块宽度 分块模式下每块的像素宽度

1.14 标题栏(TitleBar)类

枚举值 含义 典型用法
PM_TitleBarHeight 标题栏高度 QMdiSubWindow 或自定义 titlebar 的高度
PM_TitleBarButtonSize 标题栏按钮(最小化/最大化/关闭)的尺寸 三个窗口按钮的外框尺寸
PM_TitleBarButtonIconSize 标题栏按钮内部图标的尺寸 按钮内部 × 符号的尺寸

1.15 拆分条(Splitter)类

枚举值 含义 典型用法
PM_SplitterWidth 拆分条的宽度 QSplitter 中拖动拆分条的厚度

1.16 表头(Header)类

枚举值 含义 典型用法
PM_HeaderMargin 表头文字边距 表格/树表头的内边距
PM_HeaderMarkSize 排序标记(三角箭头)的尺寸 QHeaderView 排序指示器的三角大小
PM_HeaderGripMargin 表头夹点边距 可拖拽调整列宽时的手柄区域大小
// 示例:自定义表头
case PM_HeaderMargin:   return 8;   // 宽松内边距
case PM_HeaderMarkSize: return 12;  // 大排序箭头

1.17 文本控件(Text Control)类

枚举值 含义 典型用法
PM_TextCursorWidth 文本光标宽度 QLineEdit / QTextEdit 中闪烁光标 I 的宽度

1.18 杂项

枚举值 含义 典型用法
PM_MdiSubWindowFrameWidth MDI 子窗口框架宽度 QMdiArea 子窗口边框厚度
PM_MdiSubWindowMinimizedWidth MDI 最小化子窗口宽度 最小化后的窗口条宽度
PM_TreeViewIndentation 树视图缩进量 QTreeView 每层的缩进像素
PM_MaximumDragDistance 最大拖拽启动距离 超过此距离才算拖拽(否则算点击)
PM_CustomBase 自定义 pixel metric 的起始值 扩展用,用户可以在 ≥此值的位置定义自己的 metric
PM_ScrollView_ScrollBarOverlap 滚动条覆盖模式下的重叠量(Qt 6) macOS 风格的 overlay scrollbar
PM_ScrollView_ScrollBarSpacing 滚动视图内两条滚动条的间距
PM_DialogButtonsSeparator 对话框按钮分隔线宽度(Qt 6)
PM_DialogButtonsButtonWidth 对话框按钮最小宽度(Qt 6)
PM_DialogButtonsButtonHeight 对话框按钮最小高度(Qt 6)

第二部分:StyleHint(风格提示)— 110+ 项

StyleHint 是 QStyle 中最庞大的枚举体系。它定义了超过 100 个行为开关和风格属性,从"禁用文字是否加浮雕"到"右键菜单里是否显示快捷键”,无所不包。

int QStyle::styleHint(StyleHint hint,
                      const QStyleOption *option = nullptr,
                      const QWidget *widget = nullptr,
                      QStyleHintReturn *returnData = nullptr) const;

特殊机制:某些 StyleHint 通过第四个参数 returnData 返回复合数据,而不是简单的 int。例如 SH_RubberBand_Mask 返回 QStyleHintReturnMask

2.1 通用文本与渲染(General Text & Rendering)

枚举值 含义 返回值/效果
SH_EtchDisabledText 禁用文字是否加浮雕效果 1=是,0=否
SH_DitherDisabledText 禁用文字是否使用抖动渲染 1=是,0=否
SH_UnderlineShortcut 是否显示快捷键下划线 Alt 键按下时是否显示 & 符号的下划线
SH_GUIStyle 指示 GUI 风格系列 macOS / Windows / Fusion / GTK 等
SH_ScrollBar_LeftClickAbsolutePosition 点击轨道时滑块是否跳转到绝对位置 1=跳到点击位置,0=单步滚动
SH_ScrollBar_MiddleClickAbsolutePosition 中键点击行为 同上,针对中键
SH_ScrollBar_ContextMenu 滚动条是否支持右键菜单 1=是
SH_ScrollBar_RollBetweenButtons 滚动条滑块是否可滚到按钮之间(Qt 6)
SH_ScrollBar_Transient 滚动条是否瞬态显示(Qt 6) 0=始终显示, 1=仅在使用时显示
// 示例
case SH_EtchDisabledText:    return 0;  // 不用浮雕,用透明度
case SH_UnderlineShortcut:   return 0;  // 始终显示下划线(不隐藏)
case SH_ScrollBar_ContextMenu: return 0; // 禁用右键菜单

2.2 滑块(Slider)

枚举值 含义
SH_Slider_SnapToValue 拖动滑块时是否吸附到刻度值
SH_Slider_SloppyKeyEvents 键盘操作是否使用宽松检测
SH_Slider_AbsoluteSetButtons 哪些鼠标按钮实现绝对跳转
SH_Slider_PageSetButtons 哪些鼠标按钮实现翻页滚动
SH_Slider_StopOnOverlap 范围滑块是否不能交叉(Qt 6)

2.3 标签栏(TabBar)

枚举值 含义
SH_TabBar_Alignment 标签栏对齐方式(左/中/右)
SH_TabBar_SelectMouseType 切换标签需要的鼠标事件类型
SH_TabBar_ChangeCurrentDelay 切换标签的延迟(毫秒)
SH_TabBar_PreferNoArrows 是否更倾向于不显示滚动箭头
SH_TabBar_ElideMode 标签文字的省略方式
SH_TabBar_CloseButtonPosition 关闭按钮在标签中的位置
SH_TabBar_CloseButtonSize 关闭按钮的尺寸(Qt 6)
case SH_TabBar_Alignment:       return Qt::AlignCenter;
case SH_TabBar_ElideMode:       return Qt::ElideRight;

2.4 菜单(Menu)

枚举值 含义
SH_Menu_AllowActiveAndDisabled 是否允许菜单项同时处于 Active 和 Disabled
SH_Menu_SpaceActivatesItem 空格键是否激活菜单项
SH_Menu_SubMenuPopupDelay 子菜单弹出延迟(毫秒)
SH_Menu_Scrollable 菜单是否可滚动
SH_Menu_SloppySubMenus 子菜单是否使用"宽松"跟踪
SH_Menu_FlashTriggeredItem 触发项是否闪烁
SH_Menu_FadeOutOnHide 隐藏时是否渐隐
SH_Menu_KeyboardSearch 是否支持键盘打字搜索菜单项
SH_Menu_Mask 菜单是否使用遮罩(通过 returnData 返回区域)
SH_Menu_SupportsSections 是否支持菜单分区(Qt 6)
SH_Menu_SubMenuUniDirection 子菜单是否单向弹出(Qt 6)
SH_Menu_SubMenuUniDirectionFailCount 单向弹出失败次数阈值(Qt 6)
SH_Menu_SubMenuSloppySelectOtherActions 子菜单宽松选择其他项(Qt 6)
SH_Menu_SubMenuSloppyCloseTimeout 子菜单关闭宽松超时(Qt 6)
SH_Menu_SubMenuResetWhenReenteringParent 子菜单重新进入父菜单是否重置(Qt 6)
case SH_Menu_SubMenuPopupDelay: return 200;  // 子菜单延迟 200ms
case SH_Menu_KeyboardSearch:   return 1;     // 启用键盘搜索

2.5 工具栏(ToolBar)

枚举值 含义
SH_ToolBar_Movable 工具栏是否可移动(Qt 6)

2.6 组合框(ComboBox)

枚举值 含义
SH_ComboBox_Popup 下拉列表是否使用弹出框(而非就地展开)
SH_ComboBox_ListMouseTracking 下拉列表是否启用鼠标跟踪
SH_ComboBox_PopupFrameStyle 弹出框的框架样式
SH_ComboBox_UseNativePopup 是否使用平台原生弹出(Qt 6,如 macOS 的原生下拉)

2.7 SpinBox

枚举值 含义
SH_SpinBox_ButtonsInsideFrame 上下按钮是否在框架内部
SH_SpinBox_ClickAutoRepeatRate 单击自动重复速率
SH_SpinBox_ClickAutoRepeatThreshold 自动重复阈值(Qt 6)
SH_SpinBox_SelectOnStep 步进时是否选中文字(Qt 6)

2.8 表头(Header)

枚举值 含义
SH_Header_ArrowAlignment 排序箭头的对齐方式
SH_Header_Commands 表头支持哪些命令

2.9 项目视图(ItemView)

枚举值 含义
SH_ItemView_ActivateItemOnSingleClick 单击是否激活项目
SH_ItemView_ArrowKeysNavigateIntoChildren 方向键是否导航到子项
SH_ItemView_ChangeHighlightOnFocus 获得焦点时是否改变高亮
SH_ItemView_DrawDelegateFrame 是否绘制委托框架
SH_ItemView_EllipsisLocation 省略号位置
SH_ItemView_MovementWithoutUpdatingSelection 移动时是否不更新选区
SH_ItemView_PaintAlternatingRowColorsForEmptyArea 空白区域是否也绘制交替行颜色
SH_ItemView_ScrollMode 滚动模式(逐项/逐像素)
SH_ItemView_ShowDecorationSelected 选中时是否也显示装饰(图标等)
case SH_ItemView_ActivateItemOnSingleClick: return 0; // 双击才激活
case SH_ItemView_ScrollMode:                return QAbstractItemView::ScrollPerPixel;

2.10 文本控件(Text Control)

枚举值 含义
SH_TextControl_FocusIndicatorTextCharFormat 焦点指示器的文字格式
SH_BlinkCursorWhenTextSelected 有文本选中时光标是否闪烁

2.11 对话框与消息框(Dialog / MessageBox)

枚举值 含义
SH_DialogButtonBox_ButtonsHaveIcons 对话框按钮是否带图标
SH_DialogButtonLayout 对话框按钮的布局策略
SH_DialogButtons_DefaultButton 默认按钮策略
SH_MessageBox_TextInteractionFlags 消息框文字的交互标志
SH_MessageBox_CenterButtons 消息框按钮是否居中
SH_MessageBox_UseBorderForButtonSpacing 按钮间距是否通过边框实现

2.12 工具栏按钮(ToolButton)

枚举值 含义
SH_ToolButton_PopupDelay 弹出菜单的延迟(毫秒)

2.13 进度条(ProgressBar)

枚举值 含义
SH_ProgressDialog_CenterCancelButton 取消按钮是否居中
SH_ProgressDialog_TextLabelAlignment 文字标签对齐

2.14 橡皮筋(RubberBand)

枚举值 含义 returnData 类型
SH_RubberBand_Mask 橡皮筋选区的遮罩区域 QStyleHintReturnMask

2.15 窗体/窗口(Widget / Window)

枚举值 含义
SH_Widget_Animate 是否启用通用动画(Qt 6)
SH_Widget_Animation_Duration 动画持续时间(Qt 6)
SH_Widget_ShareActivation 是否共享激活状态
SH_WindowFrame_WithoutTitleBar 无标题栏窗口的框架
SH_Widget_ScrollBarPolicy 控件滚动条策略(Qt 6)
SH_Widget_SizeGuard 尺寸保护(Qt 6)

2.16 标题栏(TitleBar)

枚举值 含义
SH_TitleBar_NoBorder 标题栏是否无边框
SH_TitleBar_AutoRaise 标题栏是否自动提升
SH_TitleBar_ModifyNotification 标题栏修改通知

2.17 打印对话框(PrintDialog)

枚举值 含义
SH_PrintDialog_RightAlignButtons 打印对话框按钮是否右对齐

2.18 表单布局(FormLayout)

枚举值 含义
SH_FormLayoutFormAlignment 表单整体对齐
SH_FormLayoutLabelAlignment 标签对齐方式
SH_FormLayoutFieldGrowthPolicy 字段增长策略
SH_FormLayoutWrapPolicy 换行策略

2.19 组合框(GroupBox)

枚举值 含义
SH_GroupBox_TextLabelVerticalAlignment 文字标签垂直对齐
SH_GroupBox_TextLabelColor 文字标签颜色

2.20 杂项

枚举值 含义
SH_Workspace_FillSpaceOnMaximize 最大化时是否填满 Workspace
SH_LineEdit_PasswordMaskDelay 密码掩码的显示延迟(毫秒)
SH_LineEdit_PasswordCharacter 密码字符(通过 returnData 返回 QStyleHintReturnVariant
SH_RichText_FullWidthSelection 富文本选区是否全宽
SH_Table_GridLineColor 表格网格线颜色(通过 returnData 返回颜色)
SH_Table_GridLineStyle 表格网格线样式
SH_CustomBase 自定义 style hint 起始值

第三部分:PrimitiveElement(视觉基元)— 30+ 项

PrimitiveElement 是绘制系统中最底层的"原子”——不可再分的视觉单元。

void QStyle::drawPrimitive(PrimitiveElement element,
                           const QStyleOption *option,
                           QPainter *painter,
                           const QWidget *widget = nullptr) const;

3.1 面板与框架(Panels & Frames)

枚举值 含义 QStyleOption 类型
PE_PanelButtonCommand 命令按钮的面板背景 QStyleOptionButton
PE_PanelButtonTool 工具按钮的面板背景 QStyleOptionToolButton
PE_PanelButtonBevel 按钮的斜面面板 QStyleOptionButton
PE_PanelMenu 菜单面板背景 QStyleOptionMenuItem
PE_PanelMenuBar 菜单栏面板背景 QStyleOptionMenuItem
PE_PanelToolBar 工具栏面板背景 QStyleOptionToolBar
PE_PanelLineEdit 单行编辑框面板背景 QStyleOptionFrame
PE_PanelItemViewItem 项目视图的项背景 QStyleOptionViewItem
PE_PanelTipLabel 提示标签背景 QStyleOptionFrame
PE_PanelScrollArea 滚动区域面板(ScrollBar 轨道) QStyleOptionSlider(在 scrollbar 上下文中)
PE_Frame 通用框架线 QStyleOption
PE_FrameFocusRect 焦点矩形框架 QStyleOptionFocusRect
PE_FrameMenu 菜单框架 QStyleOptionMenuItem
PE_FrameButtonTool 工具按钮框架 QStyleOptionToolButton
PE_FrameButtonBevel 按钮斜面框架 QStyleOptionButton
PE_FrameGroupBox 组合框框架 QStyleOptionGroupBox
PE_FrameLineEdit 编辑框框架 QStyleOptionFrame
PE_FrameStatusBarItem 状态栏项框架 QStyleOptionFrame
PE_FrameTabWidget 标签页框架 QStyleOptionTabWidgetFrame
PE_FrameTabBarBase 标签栏底部框架 QStyleOptionTabBarBase
PE_FrameWindow 窗口框架 QStyleOptionTitleBar
PE_Widget 通用控件背景 QStyleOption

3.2 指示器(Indicators)

枚举值 含义 QStyleOption 类型
PE_IndicatorArrowUp 上箭头 QStyleOption
PE_IndicatorArrowDown 下箭头 QStyleOption
PE_IndicatorArrowLeft 左箭头 QStyleOption
PE_IndicatorArrowRight 右箭头 QStyleOption
PE_IndicatorButtonDropDown 下拉按钮指示器 QStyleOption
PE_IndicatorCheckBox 复选框标记(√ 或 ■) QStyleOptionButton
PE_IndicatorRadioButton 单选按钮标记(●) QStyleOptionButton
PE_IndicatorMenuCheckMark 菜单项选中标记 QStyleOptionMenuItem
PE_IndicatorHeaderArrow 表头排序箭头 QStyleOptionHeader
PE_IndicatorBranch 树视图展开/折叠分支标记 QStyleOptionViewItem
PE_IndicatorToolBarHandle 工具栏拖拽手柄装饰 QStyleOption
PE_IndicatorToolBarSeparator 工具栏分隔线 QStyleOption
PE_IndicatorDockWidgetResizeHandle 停靠窗口调整手柄 QStyleOption
PE_IndicatorViewItemCheck 视图项勾选标记 QStyleOptionViewItem
PE_IndicatorTabTear 标签可撕下指示器 QStyleOptionTab
PE_IndicatorTabClose 标签关闭按钮 QStyleOptionTab
PE_IndicatorColumnViewArrow 列视图箭头 QStyleOptionViewItem
PE_IndicatorSpinUp SpinBox 上按钮箭头 QStyleOptionSpinBox
PE_IndicatorSpinDown SpinBox 下按钮箭头 QStyleOptionSpinBox
PE_IndicatorSpinPlus SpinBox 加号 QStyleOptionSpinBox
PE_IndicatorSpinMinus SpinBox 减号 QStyleOptionSpinBox
PE_IndicatorItemViewItemDrop 项拖放指示器 QStyleOption
PE_IndicatorScrollBarSlider 滚动条滑块装饰(Qt 6) QStyleOptionSlider
// 示例:自定义复选框绘制
void MyStyle::drawPrimitive(PrimitiveElement elem,
                            const QStyleOption *opt,
                            QPainter *p,
                            const QWidget *w) const {
    switch (elem) {
    case PE_IndicatorCheckBox: {
        const auto *cb = qstyleoption_cast<const QStyleOptionButton*>(opt);
        if (!cb) break;
        
        bool checked = cb->state & State_On;
        bool partial = cb->state & State_NoChange;
        
        // 画方框
        p->setPen(checked ? accentColor : borderColor);
        p->setBrush(checked ? accentColor : Qt::NoBrush);
        p->drawRoundedRect(cb->rect.adjusted(2,2,-2,-2), 4, 4);
        
        // 画对勾
        if (checked && !partial) {
            p->setPen(QPen(Qt::white, 2));
            // 绘制 √ 路径
            QPainterPath path;
            path.moveTo(cb->rect.left()+5,  cb->rect.center().y());
            path.lineTo(cb->rect.center().x(), cb->rect.bottom()-5);
            path.lineTo(cb->rect.right()-4, cb->rect.top()+4);
            p->drawPath(path);
        }
        break;
    }
    default:
        QProxyStyle::drawPrimitive(elem, opt, p, w);
    }
}

第四部分:ControlElement(控件元素)— 30+ 项

ControlElementPrimitiveElement 高一级,组合多个 primitives 来绘制完整的简单控件。

void QStyle::drawControl(ControlElement element,
                         const QStyleOption *option,
                         QPainter *painter,
                         const QWidget *widget = nullptr) const;
枚举值 含义 QStyleOption 类型
CE_PushButton 命令按钮 QStyleOptionButton
CE_PushButtonBevel 按钮斜面 QStyleOptionButton
CE_PushButtonLabel 按钮标签(文字+图标) QStyleOptionButton
CE_CheckBox 复选框 QStyleOptionButton
CE_CheckBoxLabel 复选框标签 QStyleOptionButton
CE_RadioButton 单选按钮 QStyleOptionButton
CE_RadioButtonLabel 单选按钮标签 QStyleOptionButton
CE_TabBarTab 标签栏中的单个标签 QStyleOptionTab
CE_TabBarTabShape 标签的形状背景 QStyleOptionTab
CE_TabBarTabLabel 标签文字+图标 QStyleOptionTab
CE_ProgressBar 进度条 QStyleOptionProgressBar
CE_ProgressBarGroove 进度条轨道 QStyleOptionProgressBar
CE_ProgressBarContents 进度条填充内容 QStyleOptionProgressBar
CE_ProgressBarLabel 进度条文字标签 QStyleOptionProgressBar
CE_MenuItem 菜单项 QStyleOptionMenuItem
CE_MenuBarItem 菜单栏项 QStyleOptionMenuItem
CE_MenuBarEmptyArea 菜单栏空白区域 QStyleOptionMenuItem
CE_MenuEmptyArea 菜单空白区域 QStyleOptionMenuItem
CE_MenuTearoff 菜单撕下手柄 QStyleOptionMenuItem
CE_MenuScroller 菜单滚动按钮 QStyleOptionMenuItem
CE_MenuVMargin 菜单垂直边距 QStyleOptionMenuItem
CE_MenuHMargin 菜单水平边距 QStyleOptionMenuItem
CE_ToolBoxTab 工具箱标签 QStyleOptionToolBox
CE_ToolBoxTabShape 工具箱标签形状 QStyleOptionToolBox
CE_ToolBoxTabLabel 工具箱标签文字 QStyleOptionToolBox
CE_Header 表头 QStyleOptionHeader
CE_HeaderSection 表头分区 QStyleOptionHeader
CE_HeaderLabel 表头标签 QStyleOptionHeader
CE_HeaderEmptyArea 表头空白区域 QStyleOptionHeader
CE_ScrollBarAddLine 滚动条增加按钮 QStyleOptionSlider
CE_ScrollBarSubLine 滚动条减少按钮 QStyleOptionSlider
CE_ScrollBarAddPage 滚动条空轨道(滑块到增加按钮之间) QStyleOptionSlider
CE_ScrollBarSubPage 滚动条空轨道(滑块到减少按钮之间) QStyleOptionSlider
CE_ScrollBarSlider 滚动条滑块 QStyleOptionSlider
CE_ScrollBarFirst 滚动条第一个按钮 QStyleOptionSlider
CE_ScrollBarLast 滚动条最后一个按钮 QStyleOptionSlider
CE_ComboBoxLabel 组合框标签 QStyleOptionComboBox
CE_ToolBar 工具栏 QStyleOptionToolBar
CE_ToolButtonLabel 工具按钮标签 QStyleOptionToolButton
CE_SizeGrip 尺寸调整夹点 QStyleOptionSizeGrip
CE_Splitter 拆分条 QStyleOption
CE_RubberBand 橡皮筋选区 QStyleOptionRubberBand
CE_DockWidgetTitle 停靠窗口标题 QStyleOptionDockWidget
CE_ShapedFrame 异形框架 QStyleOptionFrame
CE_FocusFrame 焦点框架 QStyleOptionFocusRect
CE_ItemViewItem 项视图的项 QStyleOptionViewItem
CE_ColumnViewGrip 列视图夹点 QStyleOption
// 示例:自定义按钮绘制
void MyStyle::drawControl(ControlElement elem,
                          const QStyleOption *opt,
                          QPainter *p,
                          const QWidget *w) const {
    switch (elem) {
    case CE_PushButton: {
        const auto *btn = qstyleoption_cast<const QStyleOptionButton*>(opt);
        if (!btn) break;
        
        // 1. 通过 drawPrimitive 画背景
        drawPrimitive(PE_PanelButtonCommand, opt, p, w);
        
        // 2. 通过 drawControl 画标签(文字+图标)
        if (!btn->text.isEmpty() || !btn->icon.isNull()) {
            QStyleOptionButton sub = *btn;
            sub.rect = subElementRect(SE_PushButtonContents, opt, w);
            drawControl(CE_PushButtonLabel, &sub, p, w);
        }
        
        // 3. 画焦点框
        if (btn->state & State_HasFocus) {
            QStyleOptionFocusRect fropt;
            fropt.QStyleOption::operator=(*btn);
            fropt.rect = subElementRect(SE_PushButtonFocusRect, opt, w);
            drawPrimitive(PE_FrameFocusRect, &fropt, p, w);
        }
        break;
    }
    default:
        QProxyStyle::drawControl(elem, opt, p, w);
    }
}

第五部分:ComplexControl(复合控件)— 10 项

枚举值 含义 QStyleOptionComplex 子类
CC_SpinBox 数值调节框 QStyleOptionSpinBox
CC_ComboBox 组合框 QStyleOptionComboBox
CC_ScrollBar 滚动条 QStyleOptionSlider
CC_Slider 滑块 QStyleOptionSlider
CC_ToolButton 工具按钮 QStyleOptionToolButton
CC_TitleBar 标题栏(MDI 子窗口) QStyleOptionTitleBar
CC_Dial 拨盘 QStyleOptionSlider
CC_GroupBox 组合框 QStyleOptionGroupBox
CC_MdiControls MDI 控件(最小化/最大化/关闭) QStyleOptionComplex
CC_Q3DockWidget Qt 3 风格停靠窗口(已废弃)

第六部分:SubElement(子元素几何)— 45+ 项

这些枚举用于 subElementRect(),定义简单控件内的子部件矩形位置。

枚举值 所属控件 含义
SE_PushButtonContents QPushButton 按钮内容区域(文字+图标的容器)
SE_PushButtonFocusRect QPushButton 按钮焦点矩形区域
SE_CheckBoxContents QCheckBox 复选框内容区域
SE_CheckBoxIndicator QCheckBox 复选框的勾选框区域
SE_CheckBoxFocusRect QCheckBox 复选框焦点矩形
SE_CheckBoxClickRect QCheckBox 复选框点击区域(含标签)
SE_RadioButtonContents QRadioButton 单选按钮内容区域
SE_RadioButtonIndicator QRadioButton 单选按钮的圆形指示器区域
SE_RadioButtonFocusRect QRadioButton 单选按钮焦点矩形
SE_RadioButtonClickRect QRadioButton 单选按钮点击区域
SE_ComboBoxFocusRect QComboBox 组合框焦点矩形
SE_LineEditContents QLineEdit 编辑框内容区域
SE_ProgressBarGroove QProgressBar 进度条轨道区域
SE_ProgressBarContents QProgressBar 进度条进度区域
SE_ProgressBarLabel QProgressBar 进度条文字标签区域
SE_TabBarTabLeftButton QTabBar 标签左侧按钮
SE_TabBarTabRightButton QTabBar 标签右侧按钮
SE_TabBarTabText QTabBar 标签文字区域
SE_TabBarScrollLeftButton QTabBar 左滚动按钮区域
SE_TabBarScrollRightButton QTabBar 右滚动按钮区域
SE_TabWidgetTabBar QTabWidget 标签页的标签栏区域
SE_TabWidgetTabPane QTabWidget 标签页的内容面板区域
SE_TabWidgetTabContents QTabWidget 标签页内容区域
SE_TabWidgetLeftCorner QTabWidget 标签栏左角控件区域
SE_TabWidgetRightCorner QTabWidget 标签栏右角控件区域
SE_ToolBoxTabContents QToolBox 工具箱标签内容
SE_HeaderLabel QHeaderView 表头标签区域
SE_HeaderArrow QHeaderView 表头排序箭头区域
SE_TreeViewDisclosureItem QTreeView 展开/折叠标记区域
SE_ViewItemCheckMark 项视图 勾选标记区域
SE_DialogButtonBoxLayoutItem QDialogButtonBox 对话框按钮布局项
SE_ItemViewItemCheckIndicator QAbstractItemView 项勾选指示器(Qt 6)
SE_ItemViewItemDecoration QAbstractItemView 项装饰(图标)区域(Qt 6)
SE_ItemViewItemText QAbstractItemView 项文字区域(Qt 6)
SE_ItemViewItemFocusRect QAbstractItemView 项焦点矩形(Qt 6)
SE_TabBarTearIndicatorLeft QTabBar 标签左撕下指示器
SE_TabBarTearIndicatorRight QTabBar 标签右撕下指示器
SE_TreeViewDisclosureWidget QTreeView 展开/折叠控件区域(Qt 6)
SE_LineEditContents QLineEdit 编辑框内容区域(Qt 6)
SE_FrameContents QFrame 框架内容区域(Qt 6)

第七部分:SubControl(子控件几何)— 50+ 项

这些枚举用于 subControlRect()hitTestComplexControl(),定义复杂控件内子控件的矩形位置。

7.1 滚动条(CC_ScrollBar)

枚举值 含义
SC_ScrollBarAddLine 向下/向右的箭头按钮
SC_ScrollBarSubLine 向上/向左的箭头按钮
SC_ScrollBarAddPage 滑块下方的轨道区域(点击即翻页)
SC_ScrollBarSubPage 滑块上方的轨道区域
SC_ScrollBarSlider 滑块(唯一可拖拽的子控件)
SC_ScrollBarFirst 滚动条第一个按钮(极左/极上)
SC_ScrollBarLast 滚动条最后一个按钮(极右/极下)
SC_ScrollBarGroove 整个轨道区域

7.2 滑块(CC_Slider)

枚举值 含义
SC_SliderHandle 滑块手柄(可拖拽)
SC_SliderGroove 滑块轨道
SC_SliderTickmarks 刻度标记区域

7.3 SpinBox(CC_SpinBox)

枚举值 含义
SC_SpinBoxUp 增加按钮
SC_SpinBoxDown 减少按钮
SC_SpinBoxFrame 框架
SC_SpinBoxEditField 编辑区域

7.4 组合框(CC_ComboBox)

枚举值 含义
SC_ComboBoxFrame 组合框框架
SC_ComboBoxEditField 可编辑区域的编辑框
SC_ComboBoxArrow 下拉箭头按钮
SC_ComboBoxListBoxPopup 下拉列表弹出区域

7.5 工具按钮(CC_ToolButton)

枚举值 含义
SC_ToolButton 工具按钮主体
SC_ToolButtonMenu 菜单指示器(下拉小箭头)

7.6 标题栏(CC_TitleBar)

枚举值 含义
SC_TitleBarLabel 标题文字标签
SC_TitleBarSysMenu 系统菜单按钮
SC_TitleBarMinButton 最小化按钮
SC_TitleBarMaxButton 最大化按钮
SC_TitleBarCloseButton 关闭按钮
SC_TitleBarNormalButton 还原按钮(最大化后出现)
SC_TitleBarShadeButton 卷起/展开按钮
SC_TitleBarUnshadeButton 展开按钮
SC_TitleBarContextHelpButton 上下文帮助按钮

7.7 拨盘(CC_Dial)

枚举值 含义
SC_DialGroove 拨盘轨道
SC_DialHandle 拨盘手柄
SC_DialTickmarks 拨盘刻度

7.8 组合框(CC_GroupBox)

枚举值 含义
SC_GroupBoxCheckBox 组合框的可勾选标题
SC_GroupBoxLabel 组合框标题文字
SC_GroupBoxContents 组合框内容区域
SC_GroupBoxFrame 组合框框架

7.9 MDI 控件(CC_MdiControls)

枚举值 含义
SC_MdiMinButton MDI 最小化按钮
SC_MdiNormalButton MDI 还原按钮
SC_MdiCloseButton MDI 关闭按钮
// 示例:自定义 SpinBox 按钮布局(macOS 风格——并排按钮)
QRect MyStyle::subControlRect(ComplexControl control,
                              const QStyleOptionComplex *opt,
                              SubControl sc,
                              const QWidget *w) const {
    if (control == CC_SpinBox) {
        const auto *spin = qstyleoption_cast<const QStyleOptionSpinBox*>(opt);
        int btnW = 16;
        QRect r = opt->rect;
        
        // 两个按钮并排在右侧
        QRect upRect(r.right() - btnW, r.top(), btnW, r.height() / 2);
        QRect downRect(r.right() - btnW, r.center().y() + 1, btnW, r.height() / 2);
        
        switch (sc) {
        case SC_SpinBoxUp:   return upRect;
        case SC_SpinBoxDown: return downRect;
        case SC_SpinBoxEditField:
            return r.adjusted(0, 0, -btnW, 0);
        default: break;
        }
    }
    return QProxyStyle::subControlRect(control, opt, sc, w);
}

第八部分:ContentsType(内容类型)— 12 项

QSize QStyle::sizeFromContents(ContentsType type,
                               const QStyleOption *option,
                               const QSize &contentsSize,
                               const QWidget *widget = nullptr) const;
枚举值 对应控件 contentsSize 包含的内容
CT_PushButton QPushButton 文字宽度 + 图标宽度 + 图标文字间距
CT_CheckBox QCheckBox 勾选框 + 文字
CT_RadioButton QRadioButton 单选圆圈 + 文字
CT_ComboBox QComboBox 当前文字 + 下拉箭头
CT_SpinBox QSpinBox 数值文字 + 上下按钮
CT_Slider QSlider 滑块轨道 + 手柄
CT_ScrollBar QScrollBar 滚动条整体
CT_ToolButton QToolButton 图标 + 文字
CT_TabBarTab QTabBar + QTabWidget 标签文字 + 图标 + 关闭按钮
CT_MenuItem QMenu 文字 + 快捷键 + 勾选标记 + 子菜单箭头
CT_ItemViewItem QAbstractItemView 项的文字 + 图标
CT_Menu QMenu 菜单整体
CT_MenuBarItem QMenuBar 菜单栏项
CT_MdiControls QMdiSubWindow MDI 窗口控件
CT_ProgressBar QProgressBar 进度条文字 + 进度块
CT_GroupBox QGroupBox 组合框标题 + 内容区域
CT_HeaderSection QHeaderView 表头分区
CT_LineEdit QLineEdit 编辑框内容
CT_TabWidget QTabWidget 标签页整体
CT_SizeGrip QSizeGrip 尺寸调整夹点
CT_CustomBase 扩展用 自定义内容类型的起始值
// 示例:自定义按钮尺寸计算
QSize MyStyle::sizeFromContents(ContentsType type,
                                const QStyleOption *opt,
                                const QSize &contentsSize,
                                const QWidget *w) const {
    switch (type) {
    case CT_PushButton: {
        const auto *btn = qstyleoption_cast<const QStyleOptionButton*>(opt);
        QSize sz = contentsSize;
        
        // 获取 button margin
        int hMargin = pixelMetric(PM_ButtonMargin, opt, w);
        int vMargin = hMargin / 2;
        
        // 加上边距
        sz += QSize(hMargin * 2, vMargin * 2);
        
        // 设置最小尺寸
        sz = sz.expandedTo(QSize(80, 32));
        
        return sz;
    }
    default:
        return QProxyStyle::sizeFromContents(type, opt, contentsSize, w);
    }
}

第九部分:StandardPixmap(标准像素图)— 30+ 项

QPixmap QStyle::standardPixmap(StandardPixmap standardPixmap,
                                const QStyleOption *option = nullptr,
                                const QWidget *widget = nullptr) const;

这些枚举用于获取平台原生的标准图标:

枚举值 含义 典型场景
SP_ArrowUp 上箭头 滚动条、排序指示
SP_ArrowDown 下箭头 滚动条、排序指示
SP_ArrowLeft 左箭头 滚动条、导航
SP_ArrowRight 右箭头 滚动条、导航
SP_ArrowBack 返回箭头 向导/导航
SP_ArrowForward 前进箭头 向导/导航
SP_DirHomeIcon 主目录图标 文件浏览器
SP_DirIcon 目录图标 文件浏览器
SP_DirOpenIcon 打开的目录图标 文件浏览器
SP_DirClosedIcon 关闭的目录图标 文件浏览器
SP_DirLinkIcon 目录链接图标 文件浏览器
SP_FileIcon 文件图标 文件浏览器
SP_FileLinkIcon 文件链接图标 文件浏览器
SP_FileDialogStart 文件对话框起始目录
SP_FileDialogContentsView 内容视图图标
SP_FileDialogDetailedView 详细视图图标
SP_FileDialogInfoView 信息视图图标
SP_FileDialogListView 列表视图图标
SP_FileDialogNewFolder 新建文件夹
SP_FileDialogBack 后退
SP_FileDialogToParent 上级目录
SP_ComputerIcon 计算机图标
SP_DesktopIcon 桌面图标
SP_DriveHDIcon 硬盘图标
SP_DriveFDIcon 软盘图标
SP_DriveCDIcon CD 图标
SP_DriveDVDIcon DVD 图标
SP_DriveNetIcon 网络驱动器图标
SP_TrashIcon 回收站图标
SP_MessageBoxQuestion 消息框问号 QMessageBox::question
SP_MessageBoxInformation 消息框信息 i QMessageBox::information
SP_MessageBoxWarning 消息框警告 ⚠ QMessageBox::warning
SP_MessageBoxCritical 消息框错误 ⛔ QMessageBox::critical
SP_CommandLink 命令链接图标 QCommandLinkButton
SP_DialogOkButton OK 按钮图标
SP_DialogCancelButton 取消按钮图标
SP_DialogHelpButton 帮助按钮图标
SP_DialogOpenButton 打开按钮图标
SP_DialogSaveButton 保存按钮图标
SP_DialogCloseButton 关闭按钮图标
SP_DialogApplyButton 应用按钮图标
SP_DialogResetButton 重置按钮图标
SP_DialogDiscardButton 丢弃按钮图标
SP_DialogYesButton 是按钮图标
SP_DialogNoButton 否按钮图标
SP_BrowserReload 浏览器刷新
SP_BrowserStop 浏览器停止
SP_MediaPlay 媒体播放 ▶
SP_MediaStop 媒体停止 ■
SP_MediaPause 媒体暂停 ⏸
SP_MediaSkipForward 快进
SP_MediaSkipBackward 快退
SP_MediaSeekForward 向前搜索
SP_MediaSeekBackward 向后搜索
SP_MediaVolume 音量
SP_MediaVolumeMuted 静音
SP_CustomBase 自定义起始值

第十部分:State 标志位(QStyleOption::state)— 15 项

这些标志位不是 QStyle 本身的枚举,而是 QStyleOption::state 的类型,但它们是绘制流程中判断状态的核心。

标志 含义 设置条件
State_Enabled 控件可用 默认开启;禁用控件清除此位
State_MouseOver 鼠标悬停 WA_Hover,鼠标在控件上
State_Sunken 按下/下沉状态 鼠标左键按下且未释放
State_HasFocus 拥有键盘焦点 Tab 键聚焦或点击聚焦
State_Selected 被选中 在列表/表格等中被选中
State_On 开关为"开” 复选框勾选、单选按钮选中
State_Off 开关为"关” 与 State_On 互斥
State_NoChange 三态中的"部分选中” 复选框 parent 部分子项选中
State_ReadOnly 只读 控件不可编辑但可交互
State_Active 所属窗口激活 当前活动窗口
State_DownArrow 箭头向下(Qt 5) ComboBox 展开时
State_Item 项标志(Qt 5) 用于 item view
State_Editing 正在编辑 单元格编辑中
State_Raised 浮起状态 工具栏按钮可浮起
State_KeyboardFocusChange 通过键盘获得焦点 Tab 键切过来的焦点(区别于鼠标点击)
// 常见状态判断模式
bool isHovered  = opt->state & QStyle::State_MouseOver;
bool isPressed  = opt->state & QStyle::State_Sunken;
bool isDisabled = !(opt->state & QStyle::State_Enabled);
bool hasFocus   = opt->state & QStyle::State_HasFocus;
bool isChecked  = opt->state & QStyle::State_On;
bool isActive   = opt->state & QStyle::State_Active;

// 经典按钮颜色决策
QColor bg = isDisabled ? disabledColor
          : isPressed  ? pressedColor
          : isHovered  ? hoverColor
          : isChecked  ? checkedColor
          : normalColor;

附录:常用 QStyleOption 子类速查

子类 对应的枚举体系 关键字段
QStyleOptionButton CE_PushButton, PE_PanelButtonCommand, PM_ButtonMargin… text, icon, features
QStyleOptionComboBox CC_ComboBox, SC_ComboBoxArrow… currentText, frame, editable
QStyleOptionSpinBox CC_SpinBox, SC_SpinBoxUp/Down… frame, buttonSymbols, stepEnabled
QStyleOptionSlider CC_Slider, CC_ScrollBar… orientation, minimum, maximum, sliderPosition
QStyleOptionTab CE_TabBarTab, SE_TabBarTabText… text, icon, position, shape, selectedPosition
QStyleOptionMenuItem CE_MenuItem, PE_FrameMenu… text, icon, menuItemType, checked
QStyleOptionHeader CE_Header, SE_HeaderArrow… text, icon, sortIndicator, orientation
QStyleOptionToolButton CC_ToolButton, PE_PanelButtonTool… icon, text, toolButtonStyle, arrowType
QStyleOptionViewItem CE_ItemViewItem text, icon, index, showDecorationSelected
QStyleOptionProgressBar CE_ProgressBar minimum, maximum, progress, text
QStyleOptionGroupBox CC_GroupBox text, lineWidth
QStyleOptionTitleBar CC_TitleBar text, icon, titleBarState, titleBarFlags
QStyleOptionDockWidget CE_DockWidgetTitle title, closable, floatable
QStyleOptionFocusRect PE_FrameFocusRect backgroundColor
QStyleOptionRubberBand CE_RubberBand shape
QStyleOptionToolBox CE_ToolBoxTab text, icon

总结

这篇文章覆盖了 QStyle 中 300+ 个枚举值的完整说明。对于自定义 style 的开发者,建议先熟悉前三类——PixelMetric(尺寸)、StyleHint(行为)和 PrimitiveElement(绘制基元)——这三者覆盖了 80% 的实际使用场景。

在下一篇文章中,我们将把这些枚举知识应用到实战中,从头编写一个完整的现代化 QStyle。


官方文档地址