标题栏设置¶
- 自定义标题高度: 通过
setTitleBarHeight()精确控制标题栏高度 - 标题颜色定制: 支持设置标题文字颜色和背景色(QBrush),可用于未注册/只读等状态提示
- 标题对齐方式: 支持左对齐、居中对齐,可模拟 WPS 风格
- 标题图标支持: 通过
SARibbonTitleIconWidget显示窗口图标,支持左键点击和右键菜单 - 显示/隐藏切换: 支持动态隐藏或显示标题栏,适配紧凑模式
SARibbon 的标题栏(Title Bar)是位于 Ribbon 界面最顶部的区域,用于显示应用程序的窗口标题(windowTitle)。SARibbon 允许您完整定制标题栏的高度、背景颜色、文字颜色、对齐方式,以及标题图标和功能按钮。
标题栏组件结构¶
标题栏由多个子组件协同构成,它们的关系如下:
flowchart TD
TitleBar["SARibbonBar 标题栏区域"]
TitleBar --> TitleIcon["SARibbonTitleIconWidget<br/>窗口图标(左键/右键菜单)"]
TitleBar --> TitleText["标题文字<br/>windowTitle"]
TitleBar --> QuickAccess["SARibbonQuickAccessBar<br/>快速访问工具栏"]
TitleBar --> SystemButtons["SARibbonSystemButtonBar<br/>最小化/最大化/关闭"]
SystemButtons --> CustomActions["自定义 Action 按钮"]
SystemButtons --> MinBtn["最小化按钮"]
SystemButtons --> MaxBtn["最大化按钮"]
SystemButtons --> CloseBtn["关闭按钮"]
核心 API¶
SARibbonBar 提供以下标题栏相关属性与方法:
| 方法 | 参数 | 返回值 | 说明 |
|---|---|---|---|
setWindowTitleTextColor() |
const QColor& |
void |
设置标题栏文字颜色 |
windowTitleTextColor() |
无 | QColor |
获取当前标题文字颜色 |
setWindowTitleAligment() |
Qt::Alignment |
void |
设置标题文字对齐方式 |
windowTitleAligment() |
无 | Qt::Alignment |
获取标题文字对齐方式 |
setWindowTitleBackgroundBrush() |
const QBrush& |
void |
设置标题栏背景画刷 |
windowTitleBackgroundBrush() |
无 | QBrush |
获取标题栏背景画刷 |
setTitleVisible() |
bool |
void |
设置标题栏显隐状态 |
isTitleVisible() |
无 | bool |
查询标题栏是否可见 |
setTitleBarHeight() |
int, bool |
void |
设置标题栏高度 |
titleBarHeight() |
无 | int |
获取标题栏高度 |
setTabBarBaseLineColor() |
const QColor& |
void |
设置 Tab 栏底线颜色 |
tabBarBaseLineColor() |
无 | QColor |
获取 Tab 栏底线颜色 |
setEnableWordWrap() |
bool |
void |
启用/禁用标题词换行 |
isEnableWordWrap() |
无 | bool |
查询词换行是否启用 |
setEnableShowPanelTitle() |
bool |
void |
启用/禁用 Panel 标题显示 |
isEnableShowPanelTitle() |
无 | bool |
查询 Panel 标题是否显示 |
setTabOnTitle() |
bool |
void |
设置 Tab 覆盖标题栏 |
isTabOnTitle() |
无 | bool |
查询 Tab 是否覆盖标题 |
setTitleIconVisible() |
bool |
void |
设置标题图标显隐 |
isTitleIconVisible() |
无 | bool |
查询标题图标是否可见 |
titleIconWidget() |
无 | SARibbonTitleIconWidget* |
获取标题图标控件指针 |
常见场景¶
| 场景 | 推荐方法 | 说明 |
|---|---|---|
| 未注册/试用提示 | setWindowTitleBackgroundBrush() + setWindowTitleTextColor() |
红色背景 + 白色文字,醒目提示用户软件状态 |
| 只读模式 | 灰色背景 + 深色文字 | 表示当前文档不可编辑 |
| 隐藏标题栏 | setTitleVisible(false) |
适用于紧凑模式、原生边框模式 |
| 自定义对齐 | setWindowTitleAligment(Qt::AlignLeft) |
标题左对齐,类似 WPS 风格 |
| 标题图标显示 | setTitleIconVisible(true) |
显示窗口图标,支持左键点击和右键菜单 |
设置标题栏颜色和样式¶
您可以通过以下代码实现特殊的标题栏显示:
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
上面代码的显示效果如下:

使用 QSS 样式表设置标题栏¶
除代码设置外,还可以通过 Qt Style Sheets (QSS) 定制标题栏样式:
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
QSS 实时预览
修改 QSS 后需要调用 ribbon->update() 才能立即看到效果。可在开发阶段使用 QSS 调试工具实时预览样式。
重置标题栏¶
在某些场景中,您需要在动态改变标题栏颜色后恢复为默认状态:
1 2 3 4 5 6 7 8 9 10 11 12 | |
默认值说明
调用 setWindowTitleTextColor(QColor()) 或 setWindowTitleBackgroundBrush(Qt::NoBrush) 可恢复为主题默认值。QColor() 构造无效颜色对象,表示使用系统默认色。
完整代码示例¶
以下示例演示在 MainWindow 构造函数中完整初始化标题栏:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | |
提示
标题栏设置仅在宽松模式(Loose)下可见。在紧凑模式下,标题栏和 Tab 栏合并,标题栏背景色设置不会有明显效果,但文字颜色仍然生效。
标题栏图标系统菜单¶
无边框模式(UseRibbonFrame)下,标题栏左上角的程序图标点击或右键会弹出系统菜单:还原 / 移动 / 大小 / 最小化 / 最大化 / 关闭。
- 移动(M):进入系统级键盘移动模式——点击后用方向键移动窗口,回车确认、Esc 取消(与 Windows 原生系统菜单一致);
- 大小(S):进入系统级键盘缩放模式——用方向键调整窗口尺寸,回车确认、Esc 取消;
- 窗口处于最大化/全屏状态时点击移动或大小,会先还原为普通窗口再进入对应模式;
- 以上两项在 Windows 上可用;其他平台菜单中明确置灰(不提供点了没反应的菜单项)。
Note
该菜单仅在无边框模式(UseRibbonFrame)下可用——原生边框模式(UseNativeFrame)使用系统自带菜单,标题图标被隐藏。
主窗口边框绘制¶
无边框模式(UseRibbonFrame)下窗口与同色背景(例如同为白色的文档区或桌面)可能无法分辨边界。可开启可选的 1px 边框绘制:
1 2 | |
- 默认关闭:不设置时窗口外观与旧版本完全一致;
- 颜色取值顺序:自定义
frameBorderColor(有效色)→ 当前主题调色板的border-color色板 → palette 窗口色加深的兜底; - 主题联动:边框色跟随主题时,切换主题会自动重绘;
- 可见范围:左右边与底边完整可见(落在主窗口预留的内容边距区);顶边由标题栏(ribbon)覆盖,视觉上由 ribbon 自身的边界呈现;
- QWK 路径差异:启用 QWindowKit(
SARIBBON_USE_FRAMELESS_LIB=ON)时窗口由 QWK 的原生 frame 机制处理,自绘边框可能被系统 frame 覆盖,建议该路径下依赖 QWK 的边框能力。
运行 example/MainWindowExample 的 other 标签页 style 面板 "window frame border" 开关可实时验证。
拖动标题栏贴边半屏 / 最大化¶
无边框模式(UseRibbonFrame)下,拖动 ribbon 标题栏触发系统的贴边(Aero Snap)行为:
- 拖到屏幕左/右边缘 → 出现半屏预览,松手落地为左/右半屏;
- 拖到屏幕顶部 → 出现最大化预览,松手最大化;
- 从贴边状态拖离 → 还原为普通窗口;
- 最大化状态下拖动标题栏会先还原再移动(与 Office / 浏览器一致)。
标题栏上的系统按钮、快速访问工具栏、上下文页签、应用按钮、标题图标不受影响,仍然正常响应点击。
两种边框模式的差异¶
| 模式 | 贴边行为 |
|---|---|
UseRibbonFrame(默认无边框) |
由 SARibbon 把标题栏拖拽委托给系统原生消息(Windows),系统提供贴边/半屏/最大化预览;非 Windows 平台保持纯 Qt 拖拽行为(无贴边) |
UseNativeFrame(原生边框) |
系统原生边框自带完整 Snap 行为,无需配置 |
Win11 Snap Layout 弹出¶
Windows 11 的 Snap Layout 弹出层(鼠标悬停最大化按钮出现的分屏布局选择)需要 QWindowKit 路径(SARIBBON_USE_FRAMELESS_LIB=ON 并启用 SARIBBON_ENABLE_SNAPLAYOUT);默认路径只提供拖拽贴边,不提供悬停弹出层。
窗口阴影¶
无边框模式(UseRibbonFrame)默认没有阴影。可通过属性开启 DWM 系统阴影:
1 | |
平台差异¶
| 平台/路径 | 阴影行为 |
|---|---|
| Windows(默认路径) | 开启后获得 DWM 系统阴影(实现:加 WS_THICKFRAME + DwmExtendFrameIntoClientArea,配套处理 WM_NCCALCSIZE/WM_NCACTIVATE,客户区仍铺满整窗) |
| Windows(QWindowKit 路径) | QWK 自带阴影处理,setFrameShadowEnabled 为空操作 |
| macOS | 系统自带阴影,无需设置 |
| Linux | 无通用方案(依窗口管理器而定) |
注意¶
- 窗口最大化时系统不绘制阴影,这是 Windows 行为,不是 bug;
- 开启阴影后系统 resize 光标(窗口边缘的调整尺寸光标)同样由系统提供,与原有纯 Qt 缩放行为并存;
- 运行
example/MainWindowExample的 other 标签页 style 面板 "window frame shadow" 开关可实时验证。