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的,用来给程序添加图标,一种是. ...
随机推荐
- Android-图片压缩(二)-纯干货
Android - 图片压缩(一)- 项目中取图片转bitmap Android - 图片压缩(二)- 纯干货 前言:让我们手撸一个图片压缩库,对压缩工具鲁班进行升级改造. 在平常开发当中,我们一般是 ...
- 2022-12-14:给定一个正数n, 表示从0位置到n-1位置每个位置放着1件衣服 从0位置到n-1位置不仅有衣服,每个位置还摆着1个机器人 给定两个长度为n的数组,powers和rates pow
2022-12-14:给定一个正数n, 表示从0位置到n-1位置每个位置放着1件衣服 从0位置到n-1位置不仅有衣服,每个位置还摆着1个机器人 给定两个长度为n的数组,powers和rates pow ...
- 2022-11-01:给定一个只由小写字母和数字字符组成的字符串str。 要求子串必须只含有一个小写字母,数字字符数量随意。 求这样的子串最大长度是多少?
2022-11-01:给定一个只由小写字母和数字字符组成的字符串str. 要求子串必须只含有一个小写字母,数字字符数量随意. 求这样的子串最大长度是多少? 答案2022-11-01: 经典的滑动窗口问 ...
- OData WebAPI实践-与ABP vNext集成
本文属于 OData 系列文章 ABP 是一个流行的 ASP. NET 开发框架,旧版的的 ABP 已经能够非常好的支持了 OData ,并提供了对应的 OData 包. ABP vNext 是一个重 ...
- 用Linux命令操作mysql数据库
操作mysql数据库,相信大家最熟悉的应该是用navicat工具来新建数据库,建表,查询数据,查看表结构等. 但是如果数据库与本操作机器不在同一个局域网内,并且对方环境也不支持vpn的情况下,如何查询 ...
- SpringMVC 简单的开始
SpringMVC简单的开始 利用Spring模板配置写一个web项目. 1.核心配置文件(模板代码) <?xml version="1.0" encoding=" ...
- More than one file was found with OS independent path 'lib/armeabi-v7a/libflutter.so'
今日一个flutter 整合ai到原生android 时老是提示如下错误 Caused by: com.android.builder.merge.DuplicateRelativeFileExcep ...
- [abc279 G] At Most 2 Colors
G - At Most 2 Colors (atcoder.jp) 重点讲解方法三,因为方法三是蒟蒻都能想出来的方法一和方法二都可以借助方法三的思想推出 方法一 这是最简单的设置状态的方法,\(dp[ ...
- 魔力屏障 (magic) 题解
魔力屏障 (magic) [问题描述] 小 Z 生活在神奇的魔法大陆上.今天他的魔法老师给了它这样一个法阵作为它 的期末考试题目: 法阵由从左至右 n 道魔力屏障组成,每道屏障有一个临界值 a,如果它 ...
- 【HarmonyOS】详解低代码端云一体化开发之连接器
[关键字] 元服务.低代码平台.端云一体化开发.连接器.拖拽式UI [1.写在前面] 前面我们写了两篇文章分别介绍了低代码平台的基本使用和端云一体化开发中数据模型的使用,有需要的可以了解一下,文章地 ...