Documentation Documentation
主页
指南
DTK
经验分享
社区作品
关于
  • 简体中文
  • English
  • Español
GitHub (opens new window)

Deepin

Deepin 社区文档
主页
指南
DTK
经验分享
社区作品
关于
  • 简体中文
  • English
  • Español
GitHub (opens new window)
  • Dtk文档总集合
  • 接口changelog
  • UOS-Deepin 中配置 DTK 开发环境
  • Dtk的历史起源、发展,和简单入门
  • Dtkcore提供的单例类DSingleton的用法
  • Dtk自动保存主题
  • 主题相关知识集锦
    • 主题相关文件目录
    • 内嵌图标(builtin icon)相关说明
    • QIcon::FromTheme是怎么找到应用图标的
  • Dtk播放系统音效
  • 如何实现单例进程
  • DSettingsDialog使用json创建对话框及其国际化
  • DLabel的ElideMode
  • Dtkcore的DExportedInterface接口的用途
  • 判断是否社区版、如何显示 Logo 以及获取发行版名称
  • Dtk 前期准备、绘画 Qt 自带控件、创建及绘画自定义控件
  • Dtk 常用、测试代码片
  • 使用 DDesktopEntry 解析 desktop 文件
  • Dtk加载翻译文件
  • Dtk 日志管理
  • Dtk相关配置目录
  • DTK 对 pkg-config 命令的支持
  • DDesktopServices的使用
  • Dtk汉字转拼音
  • 清空回收站
  • DPathBuf拼接路径
  • 如何调用外部程序
  • DAnchors的使用
  • DBlurEffectWidget的使用
  • 窗口模糊效果
  • Codeanalysis工具的使用
  • 代码格式化脚本pre-commit
  • Qt5 GUI程序界面启动耗时统计工具
  • Scrollbar 设置为上下(左右)不到顶端
  • DAbstractUnitFormatter 单位格式化工具
  • Dtk-translate工具
  • DSettings 工具
  • Deepin-os-release 工具
  • Dlistview DViewItemActionsetwidget 用法
  • DTK问题判定方法
  • 题栏菜单没有「帮助」菜单项
  • DBackgroundGroup 移除一项后,下边的圆角没有刷新
  • 在标题栏拖动鼠标出现无法拖动窗口的问题
  • 锁屏状态下音乐播放控件状态异常
  • 应用图标异常
  • 为什么bug状态为已解决,验证依旧不通过
  • 为何我的标题栏右键菜单的背景色与应用窗口颜色不一致
  • DTK 基础教程:自定义控件规范
  • 制作 dde-control-center 插件
  • DTK
Deepin | Any developer
2020-12-11

主题相关知识集锦

# 主题相关知识集锦

# 主题相关文件目录

系统图标目录 /usr/share/icons DTK 主题文件 /usr/lib/x86_64-linux-gnu/qt5/plugins/styles


# 内嵌图标(builtin icon)相关说明

一般Qt中设置图标最简单的就是 setIcon,如 ~QAction::setIcon(const QIcon &icon); ~ 通常开发中只需要知道iconName 就可以使用, 如 QIcon::fromTheme("dialog-ok");//dialog-ok是 iconName,图标引擎会自动去存放图标主题的目录下查找。一般主题目录下存放的够用, 如果还是无法满足需求, 可以使用内嵌资源, 使用qt的资源系统, 内嵌资源也可以像使用主题中的图标一样,路径为:"qrc:/icons/deepin/builtin/[light/dark]",其中,light和dark子目录为可选,它们分别为应用程序提供亮色和暗色图标的存储,如果图标本身为通用型(在任何主题下都可使用),则图标文件直接放置到 "qrc:/icons/deepin/builtin" 目录即可。


图标分为三种类型:

TextType 纯文本性图标,其颜色会跟随画笔的前景色变化(和文字颜色保持一致)。文件放置路径:"qrc:/icons/deepin/builtin/[light/dark]/texts"

ActionType 动作型图标,其颜色会在其 Mode 改变时跟随画笔前景色(Normal 模式图标颜色不会发生变化)。文件放置路径:"qrc:/icons/deepin/builtin/[light/dark]/actions"

IconType 图标型图标,其颜色在任何模式下都不会变化。文件放置路径:"qrc:/icons/deepin/builtin/[light/dark]/icons"

图标名称规范: 名称前面需要添加能标示当前程序的前缀,例如控制中心的图标文件 dcc_xxx_32px.svg(设计大小为32)每一个都会有 "dcc_" 的前缀,其后跟图标名称(图标名称单词间使用 "_" 符号链接,且全部使用小写字母),再接着,"_32px" 为图标大小标识,标识此图标默认大小,最后的 ".svg" 为图标文件后缀名。 后记: qrc 表示是一个 Qt 资源文件,此文件需要应用程序中自行创建。"/icons/deepin/builtin" 为路径的固定前缀,随后的目录则为三种类型主题对应的目录。"actions" 为图标的类型目录,目前支持 "texts"、"actions" 和 "icons" 三种类型,"texts" 和 "actions" 目录用于放置一些工具性图标(一般都比较小,且颜色单一),"icons" 则用于放置一些颜色丰富的图标。 添加图标文件后,在程序中只需要使用 QIcon::fromTheme("dcc_xxx") 即可获取当前主题对应的图标对象,"dcc_xxx" 为图标文件名称,不包含图标大小标识和文件后缀名!

如果对图标的状态有要求,可以在路径下创建一个目录, 如 "qrc:/icon/deepin/builtin/[light/dark]/icons/dcc_icon_test_24px.svg", 这个 dcc_icon_test_24px.svg 是个目录名, 然后在目录下可以有: normal_on/normal_off, // QIcon::Normal 时 QIcon::On or QIcon::Off 的图标 disabled_on/disabled_off, // QIcon::Disabled 时 QIcon::On or QIcon::Off 的图标 active_on/active_off, // QIcon::Active 时 QIcon::On or QIcon::Off 的图标 selected_on/selected_off, // QIcon::Selected 时 QIcon::On or QIcon::Off 的图标


参考:DTK 基础教程:自定义控件规范 (opens new window)

注意要支持通过iconname查找内嵌图标的功能需要安装 dde-qt5integration 包


# QIcon::FromTheme是怎么找到应用图标的

开发qt应用的代码中少不了用到各种图标,标题栏应用图标,图标按钮(iconButton)或者菜单icon等, 在代码中使用起来很简单, 如: QIcon::fromTheme("computer"); 就可以得到「我的电脑」这个图片的icon,根据函数名是和主题相关。 那么 QIcon::fromTheme 是怎么找到对应的图标的呢? 直接上源码

QIcon QIcon::fromTheme(const QString &name)
{
    QIcon icon;
    if (qtIconCache()->contains(name)) { // 查找图标缓存
        icon = *qtIconCache()->object(name);
    } else if (QDir::isAbsolutePath(name)) {
        return QIcon(name); // 绝对路径会调用 QIcon::addFile 构造一个QIcon
    } else {
        QPlatformTheme * const platformTheme = QGuiApplicationPrivate::platformTheme();
        bool hasUserTheme = QIconLoader::instance()->hasUserTheme();
        QIconEngine * const engine = (platformTheme && !hasUserTheme) ? platformTheme->createIconEngine(name) // 根据加载的 iconloader 插件创建 iconengin
                                                   : new QIconLoaderEngine(name); // 默认的 iconloaderEngin
        QIcon *cachedIcon  = new QIcon(engine);
       icon = *cachedIcon;
        qtIconCache()->insert(name, cachedIcon); // 加入缓存
    }
    return icon;
}

代码中加载的 iconloader 插件, 一般在 qt5 的 目录下, 如笔者本机的路径是 /usr/lib/x86_64-linux-gnu/qt5/plugins/iconengines 其中 libdtkbuiltin.so 用到内嵌资源图标时会用到, libQt5XdgIconPlugin.so 查找系统主题图标时会用到。

p.s. 有同事反馈 qt5ct 这个包会导致无法找到图标.

有同事反馈,使用 qtxdg-iconfinder会失败, QIconLoader::instance()->themeName(); 读取主题,实际读出的永远是 hicolor, 最后定位时,用 libtdkgui5-bin 中的 deepin-gui-settings 返回 Settings is invalid, platform plugin is: xcb。 系 deepin-qt5dxcb-plugin 的问题。

帮助编辑此页 (opens new window)
上次更新: 12/17/2020, 2:23:36 AM
Dtk自动保存主题
Dtk播放系统音效

← Dtk自动保存主题 Dtk播放系统音效→

Theme by Vdoing | Copyright © 2020-2021 Deepin | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式