Qt 路径
- 目录与路径的区别
- 路径分隔符
- Qt 路径与 Windows 路径转换
- 相对路径
- 判断绝对路径和相对路径
- 绝对路径
- 创建路径
- 在构造 QDir 时创建
- mkdir 和 mkpath
- 判断目录是否存在
- 目录名
- 修改路径
- setPath
- cd 和 cdUp
- 删除目录
- rmdir
- rmpath
- removeRecursively
- 示例
- 当前工作目录绝对路径
- 获取当前工作目录
- 修改当前目录
- 应用程序可执行文件所在目录的绝对路径
- 应用程序可执行文件的文件的绝对路径
- currentPath, applicationDirPath 和 applicationFilePath
- 开机自启路径
- 文件路径
资源:
Qt 帮助文档
Qt 5.9 c++开发指南 7.3
Qt:路径问题小结Qt文件路径:QDir
Qt 程序构建完后会生成一个构建文件夹,命名格式以 build-项目文件名-开头。以Qt5.8中自带例子 frozencolumn 为例,构建文件夹名为 build-frozencolumn-Desktop_Qt_5_4_2_MSVC2012_OpenGL-Debug
,程序的可执行文件(.exe)就在该文件内(可能在该文件中子文件夹内)。
目录与路径的区别
路径分隔符
Qt 路径的分隔符是 /
,windows 路径分隔符为 \
。
如果路径中分隔符用 \
,则写路径时还需要转移,如:
QString strWinDir1("D:\1\2\3"); // "D:\u0001\u0002\u0003"
qDebug() << strWinDir1; // "D:\u0001\u0002\u0003"
QString strWinDir("D:\\1\\2\\3\\"); // "D:\1\2\3\"
qDebug() << strWinDir; //"D:\\1\\2\\3\\" 这里结果和 strWinDir 不一致
Qt 路径与 Windows 路径转换
- Windows 分隔符转换为 Qt 分隔符
QString QDir::cleanPath(const QString &path)
或者
QString QDir::fromNativeSeparators(const QString &pathName)
示例:
QString strWinDir1("D:\1\2\3"); // "D:\u0001\u0002\u0003"
qDebug() << strWinDir1; // "D:\u0001\u0002\u0003"
QString strWinDir("D:\\1\\2\\3\\"); // "D:\1\2\3\"
qDebug() << strWinDir; //"D:\\1\\2\\3\\" 这里结果和 strWinDir 不一致
//将windows分隔符 \ 转化为Qt分隔符 /
//cleanPath 将最后多余的 / 去掉了
QString strQtDir = QDir::cleanPath(strWinDir); // "D:/1/2/3"
//fromNativeSeparators 只是将 \ 转换为 /
QString strQtDir1 = QDir::fromNativeSeparators(strWinDir); // "D:/1/2/3/"
- Qt 分隔符转换为 Windows 分隔符
QString QDir::toNativeSeparators(const QString &pathName)
QString strWinDir1("D:\1\2\3"); // "D:\u0001\u0002\u0003"
qDebug() << strWinDir1; // "D:\u0001\u0002\u0003"
QString strWinDir("D:\\1\\2\\3\\"); // "D:\1\2\3\"
qDebug() << strWinDir; //"D:\\1\\2\\3\\" 这里结果和 strWinDir 不一致
//将windows分隔符 \ 转化为Qt分隔符 /
//cleanPath 将最后多余的 / 去掉了
QString strQtDir = QDir::cleanPath(strWinDir); // "D:/1/2/3"
//fromNativeSeparators 只是将 \ 转换为 /
QString strQtDir1 = QDir::fromNativeSeparators(strWinDir); // "D:/1/2/3/"
//Qt 分隔符转换为 Windows 分隔符
strWinDir = QDir::toNativeSeparators(strQtDir); // "D:\1\2\3"
strWinDir1 = QDir::toNativeSeparators(strQtDir1); // "D:\1\2\3\"
相对路径
上级目录: ../
如当前路径为:C:/sql/cachedtable
,则../table
表示 C:/sql/table
判断绝对路径和相对路径
bool QDir::isAbsolute() const
[static] bool QDir::isAbsolutePath(const QString &path)
bool QDir::isRelative() const
[static] bool QDir::isAbsolutePath(const QString &path)
QDir dir("D:/4/3.txt");
dir.cd("..");
bool bIsAbs1 = dir.isAbsolute(); //true
bool bIsAbs2 = QDir::isAbsolutePath("../"); //true
bool bIsRel1 = dir.isRelative(); //false
绝对路径
获取绝对路径:
bool QDir::makeAbsolute()
QString QDir::absolutePath() const
QDir dir("tem/1"); //相对路径
bool bRet1 = dir.makeAbsolute(); //true D:/3/6/7/tem/1
bool bRet2 = dir.makeAbsolute(); //已经是绝对路径了,不用转换 true
QString strAbsPath = dir.absolutePath(); // D:/3/6/7/tem/1
创建路径
只能创建文件夹路径,不能创建文件。
在构造 QDir 时创建
帮助文档说 QDir
能具体到某个文件,试了下,给到具体文件名时,用 exists
显示不存在,只具体到一个文件夹目录,则存在,QDir
会将最后的文件名当成目录:
//获取当前路径
QString strCurPath = QDir::currentPath();
//修改当前路径
bool bSetCurPath = QDir::setCurrent("D:/3/4"); //true 修改成功
QString strCurPathNew = QDir::currentPath(); // D:/3/4
//使用相对路径
QDir dir2("../1/1.txt");
bool bIsAbs2 = dir2.isAbsolute(); //false
bool bIsRel2 = dir2.isRelative(); //true
QString strPath2 = dir2.path(); //获取路径 ../1/1.txt 也是相对路径
//转换为绝对路径,D:/3/1/1.txt
QString strAbsPath2 = dir2.absolutePath();
//显示路径不存在,D:/3/1 目录存在 1.txt 的文件,但没有该目录
bool bExist2 = dir2.exists(); //false
//相对路径
QDir dir3("tem/tem.txt");
bool bIsAbs3 = dir3.isAbsolute(); //false
bool bIsRel3 = dir3.isRelative(); //false
QString strPath3 = dir3.path(); // tem/tem.txt
//获取路径名字,为绝对路径中最后一个目录名,tem.txt
QString strDirName3 = dir3.dirName(); // tem.txt
//转换为绝对路径,返回 true 成功
bool bRet3 = dir3.makeAbsolute();
QString strAbsPath3 = dir3.absolutePath(); // D:/3/4/tem/tem.txt
QString strAbsDirName3 = dir3.dirName(); // tem.txt
bool bExist3 = dir3.exists(); //false 目录不存在
//相对路径,不指定到文件
QDir dir4("../1/");
bool bIsAbs4 = dir4.isAbsolute(); // false
bool bIsRel4 = dir4.isRelative(); // true
QString strPath4 = dir4.path(); // ../1
QString strDirName4 = dir4.dirName(); // 1
QString strAbsPath4 = dir4.absolutePath(); // D:/3/1
// 文件存在
bool bExist4 = dir4.exists(); //true
mkdir 和 mkpath
bool QDir::mkdir(const QString &dirName) const
bool QDir::mkpath(const QString &dirPath) const
创建时给的路径中如果具体到某个文件,两个函数会将文件当作文件夹目录。
示例,两个函数的区别:
#include <QDir>
void Widget::createPath()
{
//创建目录
//已有 D:\2 目录,且该目录下有一个文件 1.txt;D 盘无 3 文件夹
QDir dir;
//创建的 文件夹 和已存在 文件 同名
bool ret1 = dir.mkdir("D:/2/1.txt"); //false
bool ret2 = dir.mkpath("D:/2/1.txt"); //false
//创建新目录
bool ret3 = dir.mkdir("D:/2/2.txt"); //true 创建一个名为 2.txt 的文件夹
bool ret4 = dir.mkpath("D:/2/3.txt"); //true 创建一个名为 3.txt 的文件夹
//创建已存在目录
bool ret5 = dir.mkdir("D:/2/"); //false 因为目录已存在
bool ret6 = dir.mkpath("D:/2/"); //true
//创建多级目录
bool ret7 = dir.mkdir("D:/3/4/5/"); //false 不能创建父目录
bool ret8 = dir.mkpath("D:/3/6/7"); //true 创建文件夹成功,不存在的父目录一并创建
}
1、如果创建的目录名和已存在的文件名同名,则创建失败
2、如果创建的目录已存在,mkdir
返回 false
,而 mkpath
返回 true
3、创建多级目录:mkdir
失败,不能创建不存在的父目录; mkpath
可以创建不存在的父目录
注意:这两个函数创建目录但并不会将路径修改为创建的目录:
QDir dir;
bool ret = dir.mkpath("D:/2/1/2"); //true
QString strPath11 = dir.path(); // .
dir.cd("D:/2/1/2"); //修改目录
QString strPath12 = dir.path(); // D:/2/1/2
判断目录是否存在
bool QDir::exists(const QString &name) const
只能判断目录是否存在,目录中不包含文件,见上面的示例。
目录名
该函数返回的是绝对路径的最后一级目录的名字:
//修改当前路径
bool bSetCurPath = QDir::setCurrent("D:/3/4"); //true 修改成功
QString strCurPathNew = QDir::currentPath(); // D:/3/4
QDir dir3("tem/tem.txt");
QString strDirName3 = dir3.dirName(); // tem.txt
bool bRet3 = dir3.makeAbsolute(); //转换为绝对路径
QString strAbsPath3 = dir3.absolutePath();
QString strAbsDirName3 = dir3.dirName(); // tem.txt
修改路径
setPath
void QDir::setPath(const QString &path)
设置路径
//修改当前路径
bool bSetCurPath = QDir::setCurrent("D:/3/4"); //true 修改成功
QString strCurPathNew = QDir::currentPath(); // D:/3/4
//使用相对路径
QDir dir2("../1/1.txt");
dir2.setPath("../1/");
bool bIsAbs2 = dir2.isAbsolute(); //false
bool bIsRel2 = dir2.isRelative(); //true
QString strPath2 = dir2.path(); //获取路径 ../1 也是相对路径
//转换为绝对路径,D:/3/1
QString strAbsPath2 = dir2.absolutePath();
bool bExist2 = dir2.exists(); //true
cd 和 cdUp
bool QDir::cd(const QString &dirName)
用 cd
和 setPath
的区别:如果目录是相对路径,setPath
后还是相对路径,但用 cd
后路径转换为绝对路径。
//修改当前路径
bool bSetCurPath = QDir::setCurrent("D:/3/4"); //true 修改成功
QString strCurPathNew = QDir::currentPath(); // D:/3/4
QDir dir2("../1/1.txt");
QString strPath21 = dir2.path(); // ../1/1.txt
dir2.setPath("../1/");
QString strPath22 = dir2.path(); // ../1
dir2.cd("../6/");
QString strPath23 = dir2.path(); // D:/3/6
bool QDir::cdUp()
cdUp()
相当于 cd("..")
,获取上一级目录。
注意,如果当前目录已经无上级目录,则设置完目录不变,返回 false。
删除目录
rmdir
bool QDir::rmdir(const QString &dirName) const
传入的参数 dirName
为目录名,如果输入一个多级目录的路径,删除的为最后一级目录,且该目录必须为空,只能是文件夹,不能是文件。
如果目录不存在,返回 false。
rmpath
bool QDir::rmpath(const QString &dirPath) const
传入的参数为目录的路径,可以删除给定路径的所有父目录,但路径中所有的目录必须为空目录,如 路径为 D:/6/5
,则文件夹 6 中只包含文件夹 5,文件夹 5 中无文件,则可以删除该目录。
removeRecursively
bool QDir::removeRecursively()
递归的删除目录以及子目录的所有内容,不要求目录为空。
示例
QDir dir("D:/2");
//输入的路径为相对路径
//111 子文件夹为空文件夹 ,最后只删除 111 文件夹
bool bRmDir1 = dir.rmdir("1/11/111"); // true
bool bRmDir2 = dir.rmdir("2"); //false 2 文件夹中有文件
bool bRmDir3 = dir.rmdir("3/1.txt"); //false 不能删除文件
bool bRmPath1 = dir.rmpath("4"); //false 4 文件夹中有文件
bool bRmPath2 = dir.rmpath("5/1.txt"); //false 不能删除文件
// 5 文件夹中无文件 最后删除 D:/6/5 整个路径,包括 6 文件夹
bool bRmPath3 = dir.rmpath("../6/5"); // true
//删除 D:/7 目录,该目录中包含 多级子目录和很多文件
dir.setPath("D:/7");
bool bRm = dir.removeRecursively(); //true 删除成功
当前工作目录绝对路径
获取当前工作目录
[static] QDir QDir::current()
[static] QString QDir::currentPath()
返回应用程序当前工作目录,该目录不一定是可执行文件所在目录,该路径可以通过QDir::setCurrent()
修改。
返回的路径为绝对路径。
//获取当前路径 调试时获取到当前路径为 Makefile 文件所在的路径
//如 H:/test/qt/build-qFile-Desktop_Qt_5_14_2_MSVC2017_32bit-Debug
QString strCurPath = QDir::currentPath();
修改当前目录
[static] bool QDir::setCurrent(const QString &path)
修改应用程序的工作目录。路径可以为绝对路径或者相对路径。
如果设置的为相对路径,获取的当前路径仍为绝对路径。
//获取当前路径
QString strCurPath = QDir::currentPath();
//修改当前路径
bool bSetCurPath = QDir::setCurrent("D:/3/4"); //true 修改成功
QString strCurPathNew = QDir::currentPath(); // D:/3/4
bool bSetCurPath1 = QDir::setCurrent("../6/7/");
QString strCurPathNew = QDir::currentPath(); // D:/3/6/7
应用程序可执行文件所在目录的绝对路径
[static] QString QCoreApplication::applicationDirPath()
返回可执行文件所在目录的路径,如:
//H:/qt/build-qFile-Desktop_Qt_5_14_2_MSVC2017_32bit-Debug/debug
QString strAppDir = QCoreApplication::applicationDirPath();
应用程序可执行文件的文件的绝对路径
[static] QString QCoreApplication::applicationFilePath()
返回应用程序可执行文件的路径
//H:/qt/build-qFile-Desktop_Qt_5_14_2_MSVC2017_32bit-Debug/debug/qFile.exe
QString strAppFilePath = QCoreApplication::applicationFilePath();
currentPath, applicationDirPath 和 applicationFilePath
示例:可执行文件为 cachedtable
applicationDirPath = "/home/cd-qz/Qt5.8.0/Examples/Qt-5.8/sql/
build-cachedtable-Desktop_Qt_5_8_0_GCC_64bit-Debug/bin"
applicationFilePath = "/home/cd-qz/Qt5.8.0/Examples/Qt-5.8/sql/
build-cachedtable-Desktop_Qt_5_8_0_GCC_64bit-Debug/bin/cachedtable"
currentPath = "/home/cd-qz/Qt5.8.0/Examples/Qt-5.8/sql/
build-cachedtable-Desktop_Qt_5_8_0_GCC_64bit-Debug"
开机自启路径
如果应用程序设置开机自启,注意其工作目录不是已开机后再运行程序的目录。例如在 windows 系统将一个程序设置为开机自启,该程序的可执行文件所在目录为:F:/qt/table/build-frozencolumn-Desktop_Qt_5_4_2_MSVC2012_OpenGL-Debug/debug
,开机状态运行程序其当前工作目录也是F:/qt/table/build-frozencolumn-Desktop_Qt_5_4_2_MSVC2012_OpenGL-Debug/debug
,但通过开机自启运行时工作目录是C:/Windows/system32
,但可执行文件所在目录是不变的,仍为F:/qt/table/build-frozencolumn-Desktop_Qt_5_4_2_MSVC2012_OpenGL-Debug/debug
。
文件路径
QString QDir::filePath(const QString &fileName) const
QString QDir::absoluteFilePath(const QString &fileName) const
filePath
返回文件的路径,但并不检测该路径是否存在,如果路径为相对,则返回也为相对路径,用 absoluteFilePath
可以返回绝对路径。
QDir::setCurrent("D:/2");
dir.setPath("3");
QString strFileName1 = dir.filePath("1.txt"); // 3/1.txt 返回相对路径
// 该文件 2.txt 并不存在,仍返回 3/2.txt
QString strFileName2 = dir.filePath("2.txt"); // 3/2.txt
dir.setPath("../4"); //修改路径
QString strFileName3 = dir.absoluteFilePath("1.txt"); // D:/4/1.txt 返回绝对路径
``
# 资源文件路径
Qt 添加资源文件,`:/img/a.png` 表示 `a.png` 文件是所建资源文件夹中的 `img` 文件夹的文件。
资源文件介绍见:[Qt 资源文件](https://blog.csdn.net/Lee567/article/details/126308450)