Qt 生成应用程序(二)软件多图标与文件操作
嘿,各位Qt桌面应用开发的同学们(应该Qt大部分应用场景就是这个吧),上一篇文章中,我们曾经聊到了如何设置应用程序的图标以及窗口标题图标。如果你错过了那篇文章,不要担心,可以点击这里查看:Qt修改exe文件图标。
相信你们在开发中会遇到这样的需求:把某个后缀名的文件的默认打开软件换成自己的,还要换个自定义的图标。
这篇文章就是为了解决这个烦恼,从我自己的需求出发,给大家讲解如何在Windows系统下实现这个目标。
关联某种文件的默认打开方式
首先,咱们以后缀为.tst的文件为例子,来讲一讲如何为某种后缀的文件设置默认打开方式。
通过windows的两个命令我们可以达到这样的效果assoc和ftype。
assoc
通过这个命令,我们可以关联某个后缀文件的文件类型。我们先来看看,系统中是怎么进行关联的。如果对这个命令的具体内容感兴趣可以看微软的官方文档:assoc。
在cmd中运行: assoc 

可以看到assoc仅仅是将某一个后缀的文件,关联了一个文件类型。但是assoc并没有设置默认打开的方式,这就引出了我们接下来要介绍的另外一个命令——ftype
ftype
通过这个命令我们可以设置某种文件类型的默认打开方式。同样,我们看看系统中是怎么进行设置的。对这个命令的具体内容感兴趣的可以看官方文档:ftype
在cmd中运行ftype
可以看到,这个就指定了某种文件类型应该使用哪一个软件打开,参数又是什么。

️ftype的格式如下:
ftype [[=[]]]
以txtfile为例,我们设置默认打开软件为系统自带的Notepad
解决方案
通过对上面两个命令的了解,以.tst为例,我们可以给出一个设置某种后缀的默认打开方式:
- 关联文件后缀到文件类型:assoc .tst=testfile
- 设置文件类型的默认打开软件:ftype testfile= "C:\Program Files\WindowsApps\Microsoft.WindowsNotepad_11.2305.18.0_x64__8wekyb3d8bbwe\Notepad" "TestFile" %1
️如果要将这些命令组合写进代码里,我们可以结合system函数来解决(但是还有另外一种更加简便的方法,后面会介绍):
// assoc 改变文件的文件类型名
QString assocCommand = "assoc .tst=testfile";
int result = system(assocCommand.toLocal8Bit().data());
// ftype 修改文件类型名的默认打开方式
QString FilePath = "C:/Notepad.exe";
QString ftypeCommand(R"(ftype testfile="Path" "Testfile" %1)");
ftypeCommand.replace("Path", FilePath);
result = system(ftypeCommand.toLocal8Bit().data());
️ 传入命令行的参数,我们可以在main函数里,使用argv来获取,也可以使用Qt的qApp->arguments()来获取。
设置文件默认图标
在我自己实现这个需求的时候,从网上搜到的设置文件图标的解决方法为修改注册表项中的值。以.pdf为例:
- 按下win + R, 输入 - regedit打开注册表
- 找到HKEY_CLASSES_ROOT下的.pdf 
  
- 找到描述中对应的KWPS.FDF.9(因为装了WPS,所以是KWPS) 
  
- 修改该项下的 - DefaultIcon,改为自己的图标
看到这里,同学们可能会有疑问了,这个PDF的Icon,竟然是"DLL, 13",那图标从哪里获取呢?难道从DLL中获取吗?
这里我们使用一个软件iconsext,来扣一下这个DLL的图标
可以看到,这一个DLL里面,带了很多的图标,而13则代表第13个Icon,而系统中显示的图标也确实是这个。
那么,接下来我们将为大家介绍如何为一个应用程序添加多个图标。
应用软件添加多个图标
在上一篇博客中,我们讲到,可以通过添加资源文件的方式来为应用程序添加图标。我们采取同样的方式,为一个应用程序添加多个图标。
也可以自己手动修改.rc文件,然后生成应用程序
IDI_ICON1  ICON   "D:\\Desktop\\logo.ico"
IDI_ICON2  ICON   "D:\\Desktop\\favicon.ico"
添加完之后,使用之前的iconset来查看生成应用程序的icon列表。

可以看到,我们成功的为应用程序添加了多个图标。
再按照上面所说的改动icon的方法,将文件设置成我们想要的图标就好了。
综合方法
读到这里,我们已经实现了我们想要的效果。然而,设置默认打开方式和默认图标的方法是不同的。一个是使用命令,另一个是修改注册表。这就让我们不得不写两种代码,非常的麻烦(技术人总想统一)。
细分的同学可能注意到了,前面介绍怎么修改默认图标时,在KWPS.FDF.9注册表项里,除了DefaultIcon,还有另外一个项:shell

这就是修改打开方式的第二种方法:通过设置注册表项。通过修改shell/open/command里的值,来设置默认的打开方式。
现在我们综合起来,使用Qt的QSettings类,修改注册表,达到我们的目的:
QSettings settings("HKEY_CLASSES_ROOT\\", QSettings::NativeFormat);
// 判断是否存在.myext注册表项,存在则删除
if (settings.contains(".tst/.")) {
    settings.remove(".tst");
}
if (settings.contains("testfile/.")) {
    settings.remove("testfile");
}
settings.beginGroup(".tst");
settings.setValue(".", "testfile");
settings.endGroup();
settings.beginGroup("testfile");
settings.setValue(".", "Test File");
settings.beginGroup("DefaultIcon");
settings.setValue(".", "D:\\Desktop\\myexe.exe, 1");
settings.endGroup();
settings.beginGroup("shell");
settings.beginGroup("open");
settings.beginGroup("command");
settings.setValue(".", "D:\\Desktop\\myexe.exe");
settings.endGroup();    // End 'command' group
settings.endGroup();    // End 'open' group
settings.endGroup();    // End 'shell' group
settings.endGroup();    // End 'myapp' group
好了,读到这里,相信各位同学已经了解到如何为特定类型的文件设置默认打开方式以及默认的图标。希望这些知识对大家有所帮助。感谢大家的阅读和支持!送君千里,终有一别,下一篇文章我们再见!
创作不易,如果对您有帮助,点赞、关注、收藏支持一下!不甚感激!
Qt 生成应用程序(二)软件多图标与文件操作的更多相关文章
- PHP生成小程序二维码
		/** * [生成小程序二维码] * @return [type] [description] */ public function makeMiniQrcode_do() { begin: $id ... 
- PHP生成小程序二维码合成图片生成文字
		这部分代码是写在项目上的代码,THINKPHP3.1如果迁移到其他的地方应该要稍稍改动一下以适合自己的项目 function get_bbox($text,$fsize,$ffile){ return ... 
- node 无脑生成小程序二维码图
		RT 新建createwxaqrcode.js: const request = require('request') const fs = require('fs') // eg:生成购物车列表圆形 ... 
- Unity3D学习笔记(二十五):文件操作
		文件是什么? 存储在硬盘上的最后的节点. 文件夹是什么? 文件的上级单位称为文件夹. 文件夹的基本结构? 文件夹是层级化结构的,对于同级的文件夹不可以重名,父文件夹和子文件夹可以同名> IO:I ... 
- Visual Studio 控制台应用程序 同时使用OpenCV和matlab mat文件操作
		matalb具有灵活的图像处理,代码编写起来简洁而高效.而OpenCV具有很多成熟的计算机视觉算法,能够处理很多实时的识别处理等问题,而且代码运行起来效率很高.所以如何结合两者之间的优点,是让很多学术 ... 
- C# 生成小程序码
		/// <summary> /// B接口-微信小程序带参数二维码的生成 /// </summary> /// <param name="access_toke ... 
- Java 获取微信小程序二维码(可以指定小程序页面 与 动态参数)
		一.准备工作 微信公众平台接口调试工具 小程序的唯一标识(appid) 小程序的密钥(secret) 二.获取access_token 打开微信公众平台接口调试工具,在参数列表中输入小程序的appid ... 
- 使用Qt生成第一个窗口程序
		一.打开QtCreater,点击New Project 二.在Qt中,最常用的窗口程序为widgets控件程序,这里我们选择Qt Widgets Application 三.Qt生成的debug和re ... 
- Qt 设置应用程序图标
		Qt4设置应用程序图标 将一个ico图标放在资源文件夹下; 然后建立txt,输入 IDI_ICON1 DISCARABLE "myico.ico"; 保存文件,将其后缀改为.rc; ... 
- Qt 程序和窗口添加图标
		Qt项目在打包发布之后都需要有个个性的程序图标和窗口图标,这样会使程序更加美观大方,下面我们分别来看如何给程序和窗口分别添加图标.我们需要两种格式的图片,一种是.ico的,用来给程序添加图标,一种是. ... 
随机推荐
- linux下live555编译和调试
			linux下live555编译和调试 live555 支持 h.264 初步告捷,可以播放,尽管不是很稳定,或者说暂时只能播放 1 帧(主要是我现在还不了解 帧的概念),同时还有 Mal SDP 的传 ... 
- [C++提高编程] 1、模板
			文章目录 1 模板 1.1 模板的概念 1.2 函数模板 1.2.1 函数模板语法 1.2.2 函数模板注意事项 1.2.3 函数模板案例 1.2.4 普通函数与函数模板的区别 1.2.5 普通函数与 ... 
- 快速求popcount的和
			前置知识 \(\text{popcount}(n)\) 表示将 \(n\) 转为二进制后的数中 \(1\) 的个数. 结论 \[\sum_{i=1}^{n} \text{ popcount}(i)=\ ... 
- Finalshell
			使用VMware可以得到Linux虚拟机,但是在VMware中操作Linux的命令行页面不太方便 1.内容的复制.粘贴跨越VMware不方便 2.文件的上传.下载跨越VMware不方便 3.也就是和L ... 
- 揭秘Karmada百倍集群规模多云基础设施体系
			摘要:本文结合Karmada社区对大规模场景的思考,揭示Karmada稳定支持100个大规模集群.管理超过50万个节点和200万个Pod背后的原理 本文分享自华为云社区<Karmada百倍集群规 ... 
- 2022-07-02:以下go语言代码输出什么?A:编译错误;B:Panic;C:NaN。 package main import “fmt“ func main() { var a =
			2022-07-02:以下go语言代码输出什么?A:编译错误:B:Panic:C:NaN. package main import "fmt" func main() { var ... 
- 2021-01-31:Redis集群方案不可用的情况有哪些?
			福哥答案2021-01-31:[答案来自此链接:](https://www.zhihu.com/question/442112697)一个集群模式的官方推荐最小最佳实践方案是 6 个节点,3 个 Ma ... 
- c++函数参数和返回值
			c++函数参数和返回值 函数存储位置 函数参数入栈顺序 初始化列表 函数的返回值 用参数引用来返回 返回一个参数指针 返回一个对象 总结 函数的几种变体 inline 函数 函数对象 lambda 函 ... 
- phpstudy-sqlilabs-less-2
			题目:GET - Error based - Intiger based 基于错误的数字型注入 ?id=1 ?id=1 order by 3 ?id=-1 union select 1,2,3 ?id ... 
- Python 包安装和 postgresql 的一些问题
			今天安装 hgvs 这个 python 包的时候,遇到几个比较有代表性的问题,记录分享一下. hgvs is a Python package to parse, format, validate, ... 
