主题相关知识集锦
# 主题相关知识集锦
# 主题相关文件目录
系统图标目录 /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 的问题。