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
两种方法,掷硬币决定吧