上一篇文章我们剖析了 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;
以下按功能分组,逐项说明。
| 枚举值 |
含义 |
典型用法 |
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 |
控件的默认边框宽度 |
QFrame、QLineEdit、QTextEdit 等的默认边框厚度 |
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);
}
}
| 枚举值 |
含义 |
典型用法 |
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; // 不重叠
| 枚举值 |
含义 |
典型用法 |
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; // 子菜单稍微向左偏移
| 枚举值 |
含义 |
典型用法 |
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
| 枚举值 |
含义 |
典型用法 |
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 中拖动拆分条的厚度 |
| 枚举值 |
含义 |
典型用法 |
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;
| 枚举值 |
含义 |
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; // 启用键盘搜索
| 枚举值 |
含义 |
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) |
| 枚举值 |
含义 |
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 |
按钮间距是否通过边框实现 |
| 枚举值 |
含义 |
SH_ToolButton_PopupDelay |
弹出菜单的延迟(毫秒) |
2.13 进度条(ProgressBar)#
| 枚举值 |
含义 |
SH_ProgressDialog_CenterCancelButton |
取消按钮是否居中 |
SH_ProgressDialog_TextLabelAlignment |
文字标签对齐 |
2.14 橡皮筋(RubberBand)#
| 枚举值 |
含义 |
returnData 类型 |
SH_RubberBand_Mask |
橡皮筋选区的遮罩区域 |
QStyleHintReturnMask |
| 枚举值 |
含义 |
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 |
打印对话框按钮是否右对齐 |
| 枚举值 |
含义 |
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+ 项#
ControlElement 比 PrimitiveElement 高一级,组合多个 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(),定义复杂控件内子控件的矩形位置。
| 枚举值 |
含义 |
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 |
下拉列表弹出区域 |
| 枚举值 |
含义 |
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。
官方文档地址