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

前情提要

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

比如: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++

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

两种方法,掷硬币决定吧

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值