版本:v0.1(草案,待确认定稿) · 日期:2026-08-13 流程:先定稿本计划书 → 用户确认 → 按计划进入开发
本计划书研究 DTK(Deepin ToolKit)框架的样式体系,提出在其上新增 「DTK CSS」 能力的整体方案:让开发者用接近 Web CSS 的语法为 DTK 应用描述界面样式,由引擎把 CSS 翻译为 DTK 原生的 DPalette / DStyle / DFontSizeManager 以及安全的 QSS 桥接,从而兼顾明暗主题、控件状态与 DTK 视觉规范。
DPalette
DStyle
DFontSizeManager
.theme
DThemeManager
dtkgui
DGuiApplicationHelper
提供一套 DTK CSS 语言 + 解析/应用引擎:用 CSS 选择器 + 属性描述样式。
引擎把 CSS 翻译为 DTK 原生样式 API,做到:
normal / hover / pressed / disabled / focus
Palette {}
dtkcommon
dtkcore
DColor
DPlatformTheme
dtkwidget
QCommonStyle
DApplication
D*
dtkdeclarative
qt5integration
DTK 自定义控件由 DStyle/chameleon 自行绘制,并不依赖 QSS 来渲染自身背景。 因此 QSS 可作为「二次样式」安全使用,不会破坏 DTK 视觉规范——这正是 DTK CSS 能落地的底层基础。
继承 QPalette,新增 DTK 扩展色角色(DPalette::ColorType):
QPalette
DPalette::ColorType
Window
WindowText
Base
Text
Button
ButtonText
Highlight
HighlightedText
AlternateBase
PlaceholderText
ItemBackground
TextTitle
TextTips
TextWarning
FrameBorder
颜色分组(QPalette::ColorGroup):Normal/Active、Disabled、Inactive;控件还有 Hover/Pressed/Focus 等由 DStyle 绘制的状态。
QPalette::ColorGroup
Normal/Active
Disabled
Inactive
Hover
Pressed
Focus
DGuiApplicationHelper 用 ColorType(UnknownType=跟随系统 / LightType / DarkType) 管理明暗;切换时发 themeTypeChanged() 信号。
ColorType
UnknownType
LightType
DarkType
themeTypeChanged()
DStyle 提供原生度量(部分默认):
PM_FrameRadius
PM_TopLevelWindowRadius
PM_ContentsMargins
PM_ContentsSpacing
PM_FocusBorderWidth
PM_ShadowRadius
设置圆角必须用原生 API:DStyle::setFrameRadius(widget, r)(底层写属性 _d_dtk_frameRadius)。QSS 的 border-radius 对 DStyle 自绘背景不生效。
DStyle::setFrameRadius(widget, r)
_d_dtk_frameRadius
border-radius
dtkcss
dtkcommon/dtkgui/dtkwidget
css
hover/pressed/focus
--var
@media
@theme auto/light/dark
DMainWindow
DButton
DLineEdit
DLabel
DSlider
DSwitchButton
QPushButton
*
#object-name
QObject::objectName
DLineEdit[warning="true"]
DMainWindow DButton
:hover
:pressed
:disabled
:focus
:checked
background
background-color
color
border-color
DPalette::FrameBorder
border-width
DStyle::setFrameRadius
padding
margin
setProperty
spacing
font-size
box-shadow
opacity
setWindowOpacity
setOpacity
background-image
QPalette::Disabled
DTK_CSS_NAMESPACE
DCss
DCssParser:词法 + 语法分析,产出 DCssStylesheet(规则列表)。
DCssParser
DCssStylesheet
DCssSelector:把选择器编译为匹配器,对 QWidget 做类/objectName/属性/状态匹配。
DCssSelector
QWidget
DCssRule / DCssDeclaration:单条规则与声明(含所属 @media、伪类)。
DCssRule
DCssDeclaration
DCssApplicator:核心转换器。对目标控件树:
DCssApplicator
widget->setStyleSheet()
QApplication
DCssApplicationHelper(单例):loadAppCss(path) / loadAppCssString(str)(应用级);registerWidget(w)(主题切换时重算);监听 DGuiApplicationHelper::themeTypeChanged()。
DCssApplicationHelper
loadAppCss(path)
loadAppCssString(str)
registerWidget(w)
DGuiApplicationHelper::themeTypeChanged()
(架构图见对话内联示意)
:hover/:pressed/:disabled/:focus
examples/collections
Css
@media dark
以上 5 点确认后,本计划书即定稿,进入 M1 开发。
大佬做研发,我们吃现成的
dtkdeclarative ?
jut for fun! dtkdeclarative 更厉害
Featured Collection
Popular Events
DTK CSS 功能开发计划书
0. 文档目的
本计划书研究 DTK(Deepin ToolKit)框架的样式体系,提出在其上新增 「DTK CSS」 能力的整体方案:让开发者用接近 Web CSS 的语法为 DTK 应用描述界面样式,由引擎把 CSS 翻译为 DTK 原生的
DPalette/DStyle/DFontSizeManager以及安全的 QSS 桥接,从而兼顾明暗主题、控件状态与 DTK 视觉规范。1. 背景与目标
1.1 现状
DPalette/DStyle/DFontSizeManager,或 DTK 5.x 的** QSS.theme文件**(DThemeManager)。DThemeManager已废弃,主题管理并入dtkgui的DGuiApplicationHelper,改为以调色板(palette)为主线。1.2 目标
提供一套 DTK CSS 语言 + 解析/应用引擎:用 CSS 选择器 + 属性描述样式。
引擎把 CSS 翻译为 DTK 原生样式 API,做到:
normal / hover / pressed / disabled / focus;1.3 非目标
DStyle/ chameleon 负责)。Palette {}类型(DTK CSS 以 Widget/C++ 为主,QML 为可选扩展)。2. DTK 样式体系调研结论
2.1 模块分层
dtkcommondtkcoredtkguiDPalette、DGuiApplicationHelper、DColor、DFontSizeManager、DPlatformThemedtkwidgetDStyle(继承QCommonStyle)、DApplication、各D*控件dtkdeclarativePalette {}类型(参考)qt5integrationD*控件实际由 chameleon 绘制2.2 关键使能点(为什么 DTK CSS 可行)
2.3 调色板
DPalette继承
QPalette,新增 DTK 扩展色角色(DPalette::ColorType):Window、WindowText、Base、Text、Button、ButtonText、Highlight、HighlightedText、AlternateBase、PlaceholderText等;ItemBackground、TextTitle、TextTips、TextWarning、FrameBorder等。颜色分组(
QPalette::ColorGroup):Normal/Active、Disabled、Inactive;控件还有Hover/Pressed/Focus等由DStyle绘制的状态。2.4 主题与度量
DGuiApplicationHelper用ColorType(UnknownType=跟随系统 /LightType/DarkType) 管理明暗;切换时发themeTypeChanged()信号。DStyle提供原生度量(部分默认):PM_FrameRadius=8(控件圆角)、PM_TopLevelWindowRadius=18(窗口圆角);PM_ContentsMargins=10、PM_ContentsSpacing=10、PM_FocusBorderWidth=2、PM_ShadowRadius等。设置圆角必须用原生 API:
DStyle::setFrameRadius(widget, r)(底层写属性_d_dtk_frameRadius)。QSS 的border-radius对 DStyle 自绘背景不生效。3. 总体设计
3.1 模块定位(推荐)
dtkcss,与dtkcommon/dtkgui/dtkwidget同级,依赖dtkwidget+dtkgui(QML 绑定可选依赖dtkdeclarative)。dtkwidget作为css子组件(耦合更紧、升级更慢)。推荐独立模块,便于单独发版与测试。3.2 设计原则
themeTypeChanged()实时切换。DStyle/DFontSizeManager原生 API;颜色走DPalette角色覆盖。hover/pressed/focus伪类、渐变、背景图等 QSS 原生支持且 DTK 允许二次样式的内容,生成 QSS 规则命中对应控件。--var)、@media明暗主题块、@theme auto/light/dark。4. CSS 语法规范(草案)
4.1 选择器
DMainWindow、DButton、DLineEdit、DLabel、DSlider、DSwitchButton…(也兼容 Qt 标准类如QPushButton,见待确认问题 5)。*。#object-name(按QObject::objectName命中)。DLineEdit[warning="true"]。DMainWindow DButton。4.2 伪类(状态)
:hover、:pressed、:disabled、:focus、:checked(对应控件状态)。@media而不是伪类(见下)。4.3 主题块
5. 属性映射表(CSS → DTK)
background/background-colorDPalette角色(Window/Base/Button/ItemBackground,按上下文选)colorDPalette文字角色(WindowText/Text/ButtonText)border-colorDPalette::FrameBorderborder-widthDStyle度量 / QSSborder-radiusDStyle::setFrameRadiuspadding/marginPM_ContentsMarginssetPropertyspacingPM_ContentsSpacingfont-sizeDFontSizeManager等级(T1–T10)或 pxbox-shadowDStyle阴影度量(PM_ShadowRadius 等)opacitysetWindowOpacity/setOpacitybackground-image/ 渐变:hover/:pressed/:focus:disabledQPalette::Disabled组6. 架构与核心类
6.1 类设计(命名空间
DTK_CSS_NAMESPACE/DCss)DCssParser:词法 + 语法分析,产出DCssStylesheet(规则列表)。DCssSelector:把选择器编译为匹配器,对QWidget做类/objectName/属性/状态匹配。DCssRule/DCssDeclaration:单条规则与声明(含所属@media、伪类)。DCssApplicator:核心转换器。对目标控件树:DPalette覆盖,绑定控件并随themeTypeChanged()切换;DStyle度量(frameRadius / margins / shadow)→setProperty/DStyle::setFrameRadius;hover/pressed/focus与渐变/图片等,调用widget->setStyleSheet()(或应用级QApplication)。DCssApplicationHelper(单例):loadAppCss(path)/loadAppCssString(str)(应用级);registerWidget(w)(主题切换时重算);监听DGuiApplicationHelper::themeTypeChanged()。6.2 对外 API(草案)
6.3 数据流
(架构图见对话内联示意)
7. 实现里程碑
dtkcss的 cmake/qmake、pkg-config、DCssApplicationHelper桩、命名空间DPalette映射(基础色/文字/边框)+ 明暗双调色板 + 主题切换DStyle度量(frameRadius/margins/shadow)+DFontSizeManager:hover/:pressed/:disabled/:focus+ 渐变/图片)examples/collections的 demo)dtkdeclarative的Css附加属性)8. 风险与对策
DStyle原生 API;仅把 QSS 用于其原生支持且 DTK 允许二次样式的伪类/渐变DThemeManager6.0 废弃)DGuiApplicationHelperpalette 主线实现,必要时对 5.x 做兼容分支9. 验收标准
DButton/DLineEdit/DMainWindow等的基础背景、文字色、圆角、边距。@media dark规则自动生效,无需重启应用。:hover/:pressed状态视觉变化生效。Css附加属性可达到同等效果。10. 待确认问题(请确认或调整)大家都来提提意见吧
dtkcss(推荐)还是并入dtkwidget?DThemeManager已废弃)为准,还是同时兼容 5.x?D*),还是也支持 Qt 标准控件(QPushButton等)?