使用QDesktopServices打开资源文件遇到的问题
开发时,会有点击链接会自动打开文件夹或该资源的位置的需求。比如下载文件,下载好后弹框提示位置,点击后可直接打开。
但在部分人电脑中,选择了下载位置,下载资源成功后点击弹窗中的连接,打开资源却失败了,本文主要介绍资源打开失败解决该问题的经验。
使用Qt的开发者都知道,使用QDesktopServices打开文件目录或网络连接。代码如下:
bool QDesktopServices::QDesktopServices::openUrl(const QUrl &url)
Qt文档中的介绍是该接口可以通过web浏览器打开网址url,或使用合适的应用程序打开本地文件或目录。
方法代码如下:
void CInformationDlg::onOpenFolderBtnClicked()
{
if (m_strPath.isEmpty())
{
return;
}
QString totalUrl = "";
QString lefStr = m_ strPath.left(m_ strPath.lastIndexOf("/"));
if (!lefStr.startsWith("file:///"))
{
totalUrl = "file:///" + lefStr;
}
else
{
totalUrl = lefStr;
}
QDesktopServices::openUrl(QUrl(totalUrl, QUrl::TolerantMode));
}
调用该接口主要是打开本地文件或目录。判断如果路径前没有加file:///,则加上打开本地文件,否则直接打开。
解决问题的思路是写了一个小demo,点击按钮选中一个文件夹,点击确定后,点击另一个按钮可打开刚刚选中的文件夹。在本机中选中的文件夹是桌面文件夹,获取到的路径是:
C:/Users/XXX/Desktop
将demo发给有问题的电脑,打印日志显示其桌面路径为:
//XXX/YF_YYRJ$/XXX/Desktop/
对于这种UNC路径,直接打开或者加file:///均无法使用此接口打开。
经查询,发现已有人有相似的问题,在XP\LINUX等系统中相对路径也可以,但是换成Win7下就错误,在Win7下必须得传绝对路径。
考虑到UNC路径也不是绝对路径,因此调用QUrl::fromLocalFile方法先将路径转换为绝对路径。
QUrl::fromLocalFile方法Qt官方文档的介绍中也明确表明支持带有双前导斜杠(或反斜杠)的路径,以指示远程文件,如“//servername/path/to”/文件.txt"。
调用该接口后再调用openUrl,则可以正常打开,问题解决。
最后简单介绍下几种路径名。
绝对路径(全路径):一个绝对路径以盘符(win32) 或根路径开始
相对路径:相对于当前的目录。相对路径用. …来表示。.用来表示当前目录, …用来表示当前目录的父目录。
UNC路径名:UNC 是(Universal Naming Convention)的缩写,它是一个访问在互联网上的电脑上的目录或者文件 而定义的语法。\<shared directory>\。
UNC路径名的一些规则:
•UNC 路径不能包含盘符(如 D:)
•你参访问互联网电脑分享的目录
•不能使用相对路径
URLS:URL是(Uniform Resource Locator),互联网上的文档的地址是唯一的。URL由以下部分组成:访问资源使用的协议、端口、主机的路径,比如https://www.baidu.com/。