Qt 生成应用程序(二)软件多图标与文件操作

发布时间 2023-07-29 09:32:27作者: 师从名剑山


嘿,各位Qt桌面应用开发的同学们(应该Qt大部分应用场景就是这个吧?),上一篇文章中,我们曾经聊到了如何设置应用程序的图标以及窗口标题图标。如果你错过了那篇文章,不要担心,可以点击这里查看:Qt修改exe文件图标

相信你们在开发中会遇到这样的需求:把某个后缀名的文件的默认打开软件换成自己的,还要换个自定义的图标。

这篇文章就是为了解决这个烦恼,从我自己的需求出发,给大家讲解如何在Windows系统下实现这个目标。


关联某种文件的默认打开方式

首先,咱们以后缀为.tst的文件为例子,来讲一讲如何为某种后缀的文件设置默认打开方式。

通过windows的两个命令我们可以达到这样的效果assocftype


assoc

通过这个命令,我们可以关联某个后缀文件的文件类型。我们先来看看,系统中是怎么进行关联的。如果对这个命令的具体内容感兴趣可以看微软的官方文档:assoc

在cmd中运行: assoc

assoc系统截图

可以看到assoc仅仅是将某一个后缀的文件,关联了一个文件类型。但是assoc并没有设置默认打开的方式,这就引出了我们接下来要介绍的另外一个命令——ftype


ftype

通过这个命令我们可以设置某种文件类型的默认打开方式。同样,我们看看系统中是怎么进行设置的。对这个命令的具体内容感兴趣的可以看官方文档:ftype

在cmd中运行ftype

可以看到,这个就指定了某种文件类型应该使用哪一个软件打开,参数又是什么。

在这里插入图片描述


?️ftype的格式如下:

ftype [[=[]]]

以txtfile为例,我们设置默认打开软件为系统自带的Notepad
ftype.drawio.png


解决方案

通过对上面两个命令的了解,以.tst为例,我们可以给出一个设置某种后缀的默认打开方式:

  1. 关联文件后缀到文件类型:assoc .tst=testfile
  2. 设置文件类型的默认打开软件: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为例:

  1. 按下win + R, 输入regedit打开注册表

  2. 找到HKEY_CLASSES_ROOT下的.pdf
    在这里插入图片描述

  3. 找到描述中对应的KWPS.FDF.9(因为装了WPS,所以是KWPS?)
    在这里插入图片描述

  4. 修改该项下的DefaultIcon,改为自己的图标

看到这里,同学们可能会有疑问了,这个PDF的Icon,竟然是"DLL, 13",那图标从哪里获取呢?难道从DLL中获取吗?


这里我们使用一个软件iconsext,来扣一下这个DLL的图标image.png

可以看到,这一个DLL里面,带了很多的图标,而13则代表第13个Icon,而系统中显示的图标也确实是这个。
image.png

那么,接下来我们将为大家介绍如何为一个应用程序添加多个图标。


应用软件添加多个图标

在上一篇博客中,我们讲到,可以通过添加资源文件的方式来为应用程序添加图标。我们采取同样的方式,为一个应用程序添加多个图标。

也可以自己手动修改.rc文件,然后生成应用程序


IDI_ICON1  ICON   "D:\\Desktop\\logo.ico"
 
IDI_ICON2  ICON   "D:\\Desktop\\favicon.ico"

添加完之后,使用之前的iconset来查看生成应用程序的icon列表。

image.png
可以看到,我们成功的为应用程序添加了多个图标。

再按照上面所说的改动icon的方法,将文件设置成我们想要的图标就好了。


综合方法

读到这里,我们已经实现了我们想要的效果。然而,设置默认打开方式和默认图标的方法是不同的。一个是使用命令,另一个是修改注册表。这就让我们不得不写两种代码,非常的麻烦(技术人总想统一?)。

细分的同学可能注意到了,前面介绍怎么修改默认图标时,在KWPS.FDF.9注册表项里,除了DefaultIcon,还有另外一个项:shell

image.png

这就是修改打开方式的第二种方法:通过设置注册表项。通过修改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

好了,读到这里,相信各位同学已经了解到如何为特定类型的文件设置默认打开方式以及默认的图标。希望这些知识对大家有所帮助。感谢大家的阅读和支持!送君千里,终有一别,下一篇文章我们再见!


创作不易,如果对您有帮助,点赞、关注、收藏支持一下!不甚感激!?