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自动保存主题
  • 主题相关知识集锦
  • Dtk播放系统音效
  • 如何实现单例进程
  • DSettingsDialog使用json创建对话框及其国际化
  • DLabel的ElideMode
  • Dtkcore的DExportedInterface接口的用途
  • 判断是否社区版、如何显示 Logo 以及获取发行版名称
  • Dtk 前期准备、绘画 Qt 自带控件、创建及绘画自定义控件
  • Dtk 常用、测试代码片
  • 使用 DDesktopEntry 解析 desktop 文件
    • Desktop 文件简介
      • Desktop 文件为 Linux 下软件程序的 快捷方式
      • Desktop 基本模板
      • uos 系统下使用的 desktop 文件
      • 参考资料
    • DDesktopEntry 使用介绍
      • 使用 DDesktopEntry 所需环境
      • 相关接口介绍
      • 使用代码范例
    • DDesktopEntry 获取指定格式的 key 的值
  • 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

使用 DDesktopEntry 解析 desktop 文件

使用 DDesktopEntry 解析 desktop 文件

# Desktop 文件简介

# Desktop 文件为 Linux 下软件程序的 快捷方式

Desktop Entry文件是Linux桌面系统中用于描述程序启动配置信息的文件,它以.desktop为后缀名,相当于Windows系统下的桌面快捷方式。通常一个二进制可执行程序是一个没有后缀没有图标的文件,不可以随意移动。

因此很多Linux发行版都提供了启动器,便于集中管理应用程序。启动器本质是一个位于/usr/share/applications/路径下的目录。启动器目录中存放着很多.desktop文件,每个.desktop文件都是一个应用程序的入口,并且.desktop文件可以显示图标,对用户更加友好。

# Desktop 基本模板

[Desktop Entry]
Name=<应用程序名>
Type=Application
Exec=<应用程序完整路径>
Icon=<应用程序图标的完整路径>
  • Name: desktop 文件最终显示的名称(一定要注意和 desktop 文件名的区别)
  • Type: 用于指定 desktop 文件的类型(包括 3 种类型:Application、Link、Directory)
  • Exec: 用于指定二进制可执行程序的完整路径
  • Icon: 指定应用程序图标的完整路径(可以省略后缀名)。图标支持 png 格式、svg 格式等,图标的推荐尺寸为 128x128。
Categories 分类
Network 网络应用
Chat 社交沟通
Audio 音乐欣赏
Video 视频播放
Graphics 图形图像
Office 办公学习
Translation 阅读翻译
Development 编程开发
Utility 系统管理
Other/非以上内容 其他

# uos 系统下使用的 desktop 文件

1.企业微信应用程序的 desktop 文件结构

[Desktop Entry]
Encoding=UTF-8
Type=Application
X-Created-By=Deepin WINE Team
Categories=chat;
Icon=com.qq.weixin.work.deepin
Exec="/opt/apps/com.qq.weixin.work.deepin/files/run.sh" -u %u
Name=WeChat Work
Name[zh_CN]=企业微信
Comment=Tencent WeChat Work Client on Deepin Wine
StartupWMClass=WXWork.exe
MimeType=

2.WPS 应用程序的 desktop 文件结构

[Desktop Entry]
Comment=Use WPS Writer to edit articles and reports.
Comment[zh_CN]=使用 WPS 文字编写报告,排版文章
Exec=/usr/bin/wps %f
GenericName=WPS Writer
GenericName[zh_CN]=WPS 文字
MimeType=application/wps-office.wps;application/wps-office.wpt;application/wps-office.wpso;application/wps-office.wpss;application/wps-office.doc;application/wps-office.dot;application/vnd.ms-word;application/msword;application/x-msword;application/msword-template;application/wps-office.docx;application/wps-office.dotx;application/rtf;application/vnd.ms-word.document.macroEnabled.12;application/vnd.openxmlformats-officedocument.wordprocessingml.document
Name=WPS Writer
Name[zh_CN]=WPS 文字
StartupNotify=false
Terminal=false
Type=Application
Categories=Office;WordProcessor;Qt;
X-DBUS-ServiceName=
X-DBUS-StartupType=
X-KDE-SubstituteUID=false
X-KDE-Username=
Icon=wps-office2019-wpsmain
InitialPreference=3
StartupWMClass=wps

# 参考资料

Desktop_entries (opens new window)

freedesktop.org网站 (opens new window)


# DDesktopEntry 使用介绍

# 使用 DDesktopEntry 所需环境

uos 系统下使用 apt 安装相关开发库即可,源码文件位于项目 dtkcore 下 ddesktopentry.cpp 文件中

sudo apt install -y libdtkcore5     安装后即可使用 DDesktopEntry 进行开发
sudo apt install -y libdtkcore5-dbgsym     安装后可以使用堆栈信息调试到 DDesktopEntry 源码

# 相关接口介绍

QString name() const;    //获取 desktop 文件中 Name 字段的值
QString genericName() const;    //获取 desktop 文件中 GenericName 字段的值
QString ddeDisplayName() const;    //当 desktop 文件中 X-Deepin-Vendor 字段的值为 deepin 时, 返回 genericName();否则,返回 name()
QString comment() const;    //获取 desktop 文件中 Comment 字段的值
QString stringValue(const QString &key, const QString &section = "Desktop Entry",
                        const QString &defaultValue = QString()) const;    //获取 desktop 文件中 指定的 ‘key’ 字段的值
bool setStringValue(const QString &value, const QString &key, const QString& section = "Desktop Entry");    //设置 desktop 文件中 指定的 ‘key’ 字段的值

# 使用代码范例

    DDesktopEntry desktop(fileName);  //指定需要解析的 desktop 文件名
    m_name = desktop.name();
    m_genericName = desktop.genericName();
    
    if(desktop.contains("X-Deepin-AppID")){
        m_deepinId = desktop.stringValue("X-Deepin-AppID",
                                         "Desktop Entry",
                                         settings.value("X-Deepin-AppID").toString());
    }
    
    if(desktop.contains("X-Deepin-Vendor")){
        m_deepinVendor = desktop.stringValue("X-Deepin-Vendor",
                                             "Desktop Entry",
                                             settings.value("X-Deepin-Vendor").toString());
    }
    
    QString nLocalKey = QString("Name[%1]").arg(QLocale::system().name());
    if (desktop.contains(nLocalKey)){
        m_localName = desktop.stringValue(nLocalKey, "Desktop Entry", m_name);
    }else{
        m_localName = m_name;
    }

# DDesktopEntry 获取指定格式的 key 的值

使用 DDesktopEntry 类可以获取指定格式的 key 的值,也可是给指定格式的 key 设置值。相关的接口:

获取

QString rawValue(const QString &key, const QString &section = "Desktop Entry",
                     const QString &defaultValue = QString()) const;
QString stringValue(const QString &key, const QString &section = "Desktop Entry",
                        const QString &defaultValue = QString()) const;
QString localizedValue(const QString &key, const QString &localeKey = "default",
                           const QString &section = "Desktop Entry", const QString& defaultValue = QString()) const;

设置

bool setRawValue(const QString &value, const QString &key, const QString& section = "Desktop Entry");
bool setStringValue(const QString &value, const QString &key, const QString& section = "Desktop Entry");
bool setLocalizedValue(const QString &value, const QString& localeKey,
                           const QString &key, const QString& section = "Desktop Entry");
  • rawValue:获取的是原始的 key 字段的值。比如 "key"为"Name" ,则去匹配 "Name"字段获取相应的值;遇到转义字符情况,匹配的是转义之后的字符 "key"。
  • stringValue:和raw的区别在于,当遇到遇到转义字符情况,回去匹配转义之前的字符 "key",获取相应的值。
  • localizedValue:可以和带有本地化格式的字符"key"匹配,获取相应的值。

针对转义字符转换前的字符匹配进行转换的函数(即把转义后的字符进行反向替换):

QString &DDesktopEntry::unescape(QString &str, bool unescapeSemicolons)
{
    QHash<QChar,QChar> repl;
    repl.insert(QLatin1Char('\\'), QLatin1Char('\\'));
    repl.insert(QLatin1Char('s'),  QLatin1Char(' '));
    repl.insert(QLatin1Char('n'),  QLatin1Char('\n'));
    repl.insert(QLatin1Char('t'),  QLatin1Char('\t'));
    repl.insert(QLatin1Char('r'),  QLatin1Char('\r'));

    if (unescapeSemicolons) {
        repl.insert(QLatin1Char(';'),  QLatin1Char(';'));
    }

    return doUnescape(str, repl);
}

带有本地化的格式的匹配方式:比如在 desktop 文件的 "key" 字段为 "Name[zh_CN]",则可以使用 localizedValue() 函数去获取这个字段的值,传入的参数 "key" 为 "Name"即可。

帮助编辑此页 (opens new window)
上次更新: 12/17/2020, 2:23:36 AM
Dtk 常用、测试代码片
Dtk加载翻译文件

← Dtk 常用、测试代码片 Dtk加载翻译文件→

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