Qt打开指定目录并选中文件
本文最后更新于:2021年8月26日 晚上
前情提要
有时,为了方便用户查看,我们可能需要提供在资源管理器中打开文件的功能
比如:Qt(在Explorer中显示)、Chrome(在文件夹中显示)


作用
该功能用于打开一个指定文件夹,并选中指定文件
分析
打开文件夹本质上和打开文件没什么区别,说白了就是一个URL(Uniform Resource Locator)
打开URL,我们能想到很多种方法:
Windows API中的ShellExecute()函数CMD的 start命令- Qt自带的
QDesktopServices::openUrl(const QUrl &url)静态函数 - and so on…
打开URL并不是什么难事
但我们在打开文件夹后还必须选中文件
这一点,一般的函数都做不到
もっと分析
究其原因
我们要明白,资源管理器本质上是一个应用程序
即explorer.exe
我们要对应用程序下手,最好的办法还是通过其自身的参数
命令行参数
所谓命令行参数,就是在启动时传递给程序的参数,用以执行不同操作
比如:传递给图片查看器图片的绝对路径
在C/C++中
1 | |
argv指针数组便是命令行参数
通过这些参数,程序自身便可以进行判断,获取更多外界信息
我们可以通过CMD或者拖拽文件传递命令行参数
1 | |
应用程序路径 + 空格 + 参数即可(参数间用空格分开)
explorer参数
明白了这些,我们只需要给explorer传递对应参数即可选中文件
格式如下
1 | |
理论存在 实践开始
要能非阻塞开启外部程序,并传递参数
我们大体有两种方法:
ShellExecute()QProcess
ShellExecute() - Windows API
ShellExecute函数原型及参数含义如下:
1 | |
看起来复杂,但主要就是FileName和Parameters,举个例子便一目了然
1 | |
但是在实际应用中,我们还是要注意一点
大多Windows API都分为了两个版本:W版和A版
也就是ShellExecuteW和ShellExecuteA
区别是W代表宽字符,采用Unicode编码,A代表ASCII编码
由于文件路径可能出现中文,所以我们采用ShellExecuteW
1 | |
L"open"前的L代表将"open"转化为宽字符,否则不符合参数类型LPCWSTR(typedef const wchar_t* LPCWSTR;)
而QString也要相应地转化为宽字符版本
Perfect
QProcess - Qt类
接下来我们看看Qt特有的类-QProcess
该类可用于完成启动外部程序,并与之交互通信
但此次我们不需要通信,只要传入参数并非阻塞启动即可
1 | |
由于是Qt内部的类,所以不需要特殊处理宽字符,因为Qt一律采用Unicode编码
Windows API,你看看人家
Over
两种方法,掷硬币决定吧