Qt 路径


Qt中路径问题小结

原文链接:https://blog.csdn.net/Andy_93/article/details/52831175

在做Qt项目的时候,我们难免遇到到文件路径问题。 如QFile file(“text.txt”)加载不成功、QPixmap(“…/text.png”) 加载图片不成功等等。今天就来做一个关于Qt路径问题的小结!

首先需要弄清楚两个概念:绝对路径与相对路径

绝对路径: 文件在硬盘上真正存在的路径。例如“text.jpg”这个图片是存放在硬盘
的“E:\book\目录下,那么 “text.jpg”这个图片的绝对路径就是“E:\book\text.jpg"

相对路径:由这个文件所在的路径引起的跟其它文件(或文件夹)的路径关系
如当前file1的路径是/user/File/file1/file1.txt,
File2的路径是/user/File/file2/file2.txt
那么file2相对于file的路径就是“…/file2/file2.txt”。
相对路径里常使用“…/”来表示上一级目录

弄清楚了上面两个概念,在来弄清楚我们常用到的“: /”与"./":
./ : 表示当前路径 如“./log/log1.txt” 表示当前路径下的log目录下的log1.txt
: / : 表示对资源的引用,引用资源文件路径 如“:/image/start.png” 表示资源文件里面定义的文件start.png

现在我们来解释下QFile file(“text.txt”)加载不成功 ,如果text.txt是在可执行文件同级目录下,是可以打开的
的,否则则打不开

下面讲几个Qt常用的获取路径的函数

1 .获取应用程序可执行文件所在的目录: QCoreApplication::applicationDirPath();
	QString applicationDirPath;
	applicationDirPath = QCoreApplication::applicationDirPath();
	qDebug()<<"applicationDirPath"<<applicationDirPath;
 
2.获取应用程序可执行文件的文件路径: QCoreApplication::applicationFilePath();
	QString applicationFilePath;
	applicationFilePath = QCoreApplication::applicationFilePath();
	qDebug()<<"applicationFilePath"<<applicationFilePath;
 
3.获取应用程序当前工作目录的绝对路径:QString QDir::currentPath()  (这个类似于“./”操作)
	QString currentPath;
	QDir dir;
	currentPath=dir.currentPath(); 
	qDebug()<<"path"<<currentPath;
	
将相对路径转化为绝对路径:
     QDir temDir("../../image.png");
	 QString filePath = temDir.absolutePath();
这样就获得了一个文件的绝对路径了。

再来讲讲Qt资源系统:Qt 资源系统是一个跨平台的资源机制,用于将程序运行时所需要的资源以二进制的形式存储于可执行文件内部。 如果你的程序需要加载特定的资源(图标、文本翻译等), 那么,将其放置在资源文件中,就再也不需要担心这些文件的丢失。也就是说,如果你将资源以资源文件形式存储,它是会编译到可执行文件内部。

所以再来讲讲Qt资源文件qrc文件的创建。
方法1、使用qtdesinger创建.qrc文件
(1)在资源管理器窗口中选择新建一个资源文件.qrc,保存文件即可;
(2)在资源管理器窗口中选择添加资源和文件即可;

方法2、手工写文件的方法,.qrc可以用记事本打开,大概的形式是这样的:

   <RCC>
       <qresource prefix="/" >  //前缀
            <file>image/text.png</file>
        </qresource>
    </RCC>

然后在pro文件中添加一句
RESOURCES = xxx.qrc

这样在使用的时候QPixmap(“:/image/text.png”);就能加载成功了

同时为了以后我们修改text.png路径的时候我们还需要一处处的修改源代码,所以在建立资源qrc的时候,给每个资源文件起一个别名
如 :

   <RCC>
      <file alias="image_copy.png">images/copy.png</file>
  </RCC>

这时该文件可以通过QPixmap(“:/image_copy.png”);能加载成功。
但通过QPixmap(“:/images/copy.png”);加载不成功,QT里“: /”表示对资源的引用,不是表示当前目录

==>使用别名是为了日后资源文件路径改变而去改动源代码。用别名后,只需要修改qrc文件即可!

目录与路径的区别

原文链接:https://blog.csdn.net/Lee567/article/details/106257056

路径分隔符

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)

或者

QString QDir::fromNativeSeparators(const QString &pathName)

2. 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

创建路径
只能创建文件夹路径,不能创建文件。

在构造 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

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值