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)就在该文件内(可能在该文件中子文件夹内)。

目录与路径的区别

Windows 目录与路径的区别

路径分隔符

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 路径转换

  1. Windows 分隔符转换为 Qt 分隔符

QString QDir::cleanPath(const QString &path)

qt android 中文路径 qt 文件路径_qt


或者

QString QDir::fromNativeSeparators(const QString &pathName)

qt android 中文路径 qt 文件路径_相对路径_02

示例:

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/"
  1. Qt 分隔符转换为 Windows 分隔符

QString QDir::toNativeSeparators(const QString &pathName)

qt android 中文路径 qt 文件路径_相对路径_03

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 时创建



qt android 中文路径 qt 文件路径_Qt_04


帮助文档说 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



qt android 中文路径 qt 文件路径_Qt_05

创建时给的路径中如果具体到某个文件,两个函数会将文件当作文件夹目录。
示例,两个函数的区别:

#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

只能判断目录是否存在,目录中不包含文件,见上面的示例。

目录名

qt android 中文路径 qt 文件路径_Qt_06


该函数返回的是绝对路径最后一级目录的名字:

//修改当前路径
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)

qt android 中文路径 qt 文件路径_Qt_07

cdsetPath 的区别:如果目录是相对路径,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()

递归的删除目录以及子目录的所有内容,不要求目录为空。

qt android 中文路径 qt 文件路径_qt_08

示例

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)