|
QtCanpool 3.3.0
|
qxtheme 提供进程级的主题引擎,即 QxTheme::QxThemeManager
在引擎出现之前,主题能力是互不相干的两半:
RibbonTheme(qxribbon)能装载样式表,但**没有调色板**、**不持久化**、**不跟随系统**;WindowStyleAgent(qxwindow)只能**探测**系统明暗,并不负责应用。结果是菜单、原生对话框、工具提示、禁用态文字这些样式表覆盖不到的表面停留在平台默认色, 和深色样式表明显不搭。QxThemeManager 把「调色板」与「样式表」作为一件事一起应用, 并补上持久化与系统跟随。
| 枚举 | 配置 id | 显示名 | 深色 |
|---|---|---|---|
LightYellow | light-yellow | Light Yellow | |
LightOffice2013 | light-office2013 | Light Office 2013 | |
LightClassic | light-classic | Light Classic | |
LightFancy | light-fancy | Light Fancy | |
DarkWps | dark-wps | Dark WPS | ✓ |
DarkOfficePlus | dark-officeplus | Dark Office Plus | ✓ |
Custom | custom | Custom |
枚举顺序与 RibbonTheme::ThemeStyle 一致,两者无需转换表即可对应。 **配置 id 是对外契约**:它被写进配置文件,改动需要配合配置迁移。
辅助函数:
| 函数 | 说明 |
|---|---|
| QxTheme::themeId | 取稳定 id |
| QxTheme::themeName | 取显示名,适合放进设置对话框 |
| QxTheme::themeFromId | 由 id 反查枚举,未知 id 返回给定的回退值 |
| QxTheme::isDarkTheme | 是否为深色主题 |
| QxTheme::themeStyleSheetPath | 内置样式表的资源路径(Custom 为空) |
| QxTheme::themeStyleSheet | 内置样式表的内容,资源缺失时为空 |
在 QApplication 构造完成之后取得单例即可,选择会被持久化,下次启动自动恢复:
setTheme() 会立即应用并发出 themeChanged();apply() 用于把当前主题重新装一遍 (比如在外部改动了样式表之后)。
应用主题只做两件事:QApplication::setPalette() 与 QApplication::setStyleSheet()。 Qt 随后会向所有部件派发 QEvent::StyleChange,而 qxribbon 与 qxdock 早已有为该事件 准备的既有处理(例如 RibbonBar 重新读取主题、DockTab 重刷样式)。 因此引擎不需要知道有哪些窗口存在。
默认配对是 LightOffice2013 / DarkOfficePlus。开启跟随之后:
QStyleHints::colorSchemeChanged);refreshSystemTheme() 重新评估。内置样式表位于 :/qxribbon/res/stylesheets/*.css,是 qxribbon 的资源。 引擎**不链接 qxribbon**:资源是进程级注册的,只要 qxribbon 被链接进进程,按路径就能读到。 所以 qxribbon 一侧零改动,非 Ribbon 应用也可以使用主题引擎。
资源不可用时(例如没链接 qxribbon),引擎**只应用调色板并告警一次**, 而不会清空样式表 —— 清空会抹掉调用方自己设置的样式。
要提供自己的样式表,两种方式:
Custom 主题没有内置资源,配合上面两种方式使用最合适。 styleSheet(theme) 可以查看 apply() 实际会装载的内容。
主题选择通过 QxCore::QxSettings 存储:
| 键 | 内容 |
|---|---|
theme | 主题的配置 id |
followSystem | 是否跟随系统 |
systemLightTheme / systemDarkTheme | 跟随系统时使用的配对 |
settings() 返回引擎持有的 QxCore::QxSettings 对象;setSettings() 可以替换它 (所有权转移,已存的值会被重新读取),这也是让测试使用一个隔离配置文件的方式。
qxribbon/res/stylesheets/ 下的样式表,其顶部注释块列出了该主题的 qtcanpool-qss 设计令牌(背景、前景、强调色、边框等)。qxthemepalette.cpp 中补上色值。Custom + setStyleSheetFile() 即可,无需改库。**注意**:
RibbonTheme仍然存在,是 widget 级的样式表加载器。 让它转发到引擎会引入qxribbon → qxtheme的库依赖,需要先确认这一决策。