一个 %20 的陷坑,企图用QSettings 生成.desktop 文件的误操作

这两天有一个临时需求,需要给客户的 Linux 桌面上生成一批“快捷方式” ,“快捷方式”这个说法源于Windows 上的叫法,双击桌面图标就可以调用一个可执行文件, 在Linux 上的做法是创建一个 .desktop 文件,严格按照规范的格式去写就可以了;


当时我目测这就是一个十分常见的 ini 文件,Qt 中有专门读写配置文件的类 QSettings ,于是我几行代码来写了一个看似没有问题的文件

QSettings *configIniWrite = new QSettings( this->setupFile, QSettings::IniFormat);
configIniWrite->setIniCodec("UTF8");
configIniWrite->beginGroup("[Desktop Entry]");
configIniWrite->setValue("Name", appName);
configIniWrite->setValue("GenericName","Cloud Application");
configIniWrite->setValue("Comment","VEsystem");
configIniWrite->setValue("Exec",ExecVar);
configIniWrite->setValue("Icon" , pngfile);
configIniWrite->setValue("Terminal",false);
configIniWrite->setValue("Type","Application");
configIniWrite->endGroup();

果然文件可以被生成出来,但是这个文件放在桌面上并不启作用,系统也不认为这是一个图标? 用文本编辑器打开文件仔细看看才发现  [Desktop Entry]  这个节点名称不对了, 注意这中间是一个空格,在被写到文件中后,中间的空格变成了 %20 ,结果成了 [Desktop%20Entry] 这就很坑了,我不太在意判定这只是被自动转义了,不让它转义不就行了?结果无论我怎么加 \  斜杆,都不能转义出空格来。 还不意思跑去问了 腰花(耀华)同学 和鹤老师,他们无均告之这是自动转义是正常的,对于普通的 ini 文件并不影响读取,但是对于图标文件他们也没有试过用QSettings 来生成,一般正常都写在应用发布时的打包脚本中做事.... 我这儿的需求不同,我必须通过我的程序来批量生成,后来又问了乔老师,乔老师倒是提供了一个更更专业的方案,我需求安装一个 Qt5 Xdg 的库,调用 Xdg 中方法来生成....

乔老师还专业演示了一遍,的确可行


但是这样会需要再增加一个库,增加体积不说,这个程序后面需要放在 基于龙芯平台的中标麒麟系统上运行,编译时又各种报缺库,想想为了生成一个 文本文件而以不至于这么费事了,索性直接把它当成一个文本文件来写好了。

option = " "+option;
QString ExecVar = VEREMOTEAPP + option;
QTextStream out(&file);
out<<"[Desktop Entry]"<<endl;
out<<"Name="+ appName << endl;
out<<"GenericName=Cloud Application"<<endl;
out<<"Comment=VEsystem"<<endl;
out<<"Exec="+ ExecVar <<endl;
out<<"Icon=" + pngfile <<endl;
out<<"Terminal=false" <<endl;
out<<"Type=Application" <<endl;
out.flush();
file.close();

通过文本文件的方式直接写入的确就没有%20 了,我又去查了Qt 的官方文档,QSettings 是按 URL 的编码规范来进行处理的,各种符号都会被强制转义,强制的.... 

其实有的时候解决问题要变通一下,不一定非得按一个固定的思路去走。