Qt打开指定目录并选中文件

前情提要

有时,为了方便用户查看,我们可能需要提供在资源管理器中打开文件的功能

比如:Qt(在Explorer中显示)、Chrome(在文件夹中显示)

Qt打开指定目录并选中文件_第1张图片
请添加图片描述

作用

该功能用于打开一个指定文件夹,并选中指定文件

分析

打开文件夹本质上和打开文件没什么区别,说白了就是一个URL(Uniform Resource Locator)

打开URL,我们能想到很多种方法:

  • Windows API中的ShellExecute()函数
  • CMD 的 start命令
  • Qt自带的QDesktopServices::openUrl(const QUrl &url)静态函数
  • and so on…

打开URL并不是什么难事

但我们在打开文件夹后还必须选中文件

这一点,一般的函数都做不到

もっと分析

究其原因

我们要明白,资源管理器本质上是一个应用程序

explorer.exe

我们要对应用程序下手,最好的办法还是通过其自身的参数

命令行参数

所谓命令行参数,就是在启动时传递给程序的参数,用以执行不同操作

比如:传递给图片查看器图片的绝对路径

C/C++

void main(int argc, char* argv[])

argv指针数组便是命令行参数

通过这些参数,程序自身便可以进行判断,获取更多外界信息

我们可以通过CMD或者拖拽文件传递命令行参数

test.exe argument

应用程序路径 + 空格 + 参数即可(参数间用空格分开)

explorer参数

明白了这些,我们只需要给explorer传递对应参数即可选中文件

格式如下

explorer.exe /select, URL

理论存在 实践开始

要能非阻塞开启外部程序,并传递参数

我们大体有两种方法:

  • ShellExecute()
  • QProcess

ShellExecute() - Windows API

ShellExecute函数原型及参数含义如下:

ShellExecute(
hWnd: HWND; //{指定父窗口[句柄]}
Operation: PChar; //{指定动作, 譬如: open、runas、print、edit、explore、find}
FileName: PChar; //{指定要打开的文件或程序}
Parameters: PChar; //{给要打开的程序指定参数} <-命令行参数
Directory: PChar; //{缺省目录}
ShowCmd: Integer //{打开选项}
);

看起来复杂,但主要就是FileNameParameters,举个例子便一目了然

ShellExecute(NULL, "open", "explorer", "/select, E:\test.png", NULL, SW_SHOW);//打开E:\test.png并选中

但是在实际应用中,我们还是要注意一点

大多Windows API都分为了两个版本:W版和A版

也就是ShellExecuteWShellExecuteA

区别是W代表宽字符,采用Unicode编码,A代表ASCII编码

由于文件路径可能出现中文,所以我们采用ShellExecuteW

ShellExecuteW(NULL, L"open", L"explorer", QString("/select, \"%1\"").arg(ImagePath).toStdWString().c_str(), NULL, SW_SHOW);

L"open"前的L代表将"open"转化为宽字符,否则不符合参数类型LPCWSTR(typedef const wchar_t* LPCWSTR;)

而QString也要相应地转化为宽字符版本

Perfect

QProcess - Qt类

接下来我们看看Qt特有的类-QProcess

该类可用于完成启动外部程序,并与之交互通信

但此次我们不需要通信,只要传入参数并非阻塞启动即可

QProcess process;
process.startDetached(QString("explorer /select,\"%1\"").arg(ImagePath));//启动后分离,即非阻塞

由于是Qt内部的类,所以不需要特殊处理宽字符,因为Qt一律采用Unicode编码

Windows API,你看看人家

Over

两种方法,掷硬币决定吧

你可能感兴趣的:(Qt,qt,windows)