Qt 路径

news2025/1/21 0:59:31

Qt 路径

  • Qt中路径问题小结
  • 目录与路径的区别
    • 路径分隔符
    • Qt 路径与 Windows 路径转换
    • 相对路径
    • mkdir 和 mkpath
    • 判断目录是否存在
    • 修改路径setPath


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/469080.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【重学c++primer】第二章 深入浅出:变量的类型

文章目录 【重学cprimer】第二章 变量以及变量的基本类型1、从初始化/赋值语句说起2、类型详解一些未定义部分字面值变量以及变量的类型隐式类型转换 3、复合类型&#xff1a;从指针到引用指针的操作void*指针的好处引用指针的引用 4、常量和常量表达式类型const和指针const的赋…

AndroidStudio导入Android AOSP源码

一、生成导入到AS所需的配置文件 1.1、切换到Android源码的目录&#xff0c;执行配置环境脚本 source build/envsetup.sh1.2、执行lunch,选择对应产品 lunch1.3、执行make idegen make idegen编译完成后&#xff0c;就可以在Android源码的根目录下看到android.iml和android…

元宇宙展厅--音乐科技展厅

作为音乐科技领域的先锋&#xff0c;这里是一个展示最新音乐科技的创新空间。我们的元宇宙展厅汇聚了来自世界各地最前沿的音乐创新&#xff0c;将展示最新、具有前瞻性的音乐科技应用。让您可以深入了解这个领域的最新发展。 一、音乐科技展厅概述 让我们来了解一下我们的元宇…

首期smardaten无代码训练营圆满收官,两周内容精彩回顾!

”smardaten无代码训练营&#xff0c;旨在通过线上碎片化时间的课程学习实操演练&#xff0c;帮助学员探索产品能力&#xff0c;验证项目需求&#xff0c;实现多个demo系统的复刻搭建。“ 首期smardaten无代码训练营于上周圆满收官&#xff01;本期共有64名学员报名参加&#…

KDZR-10A三相直流电阻测试仪

一、产品概述 直流电阻的测量仪是变压器、互感器、电抗器、电磁操作机构等感性线圈制造中半成品、成品出厂试验、安装、交接试验及电力部门预防性试验的项目&#xff0c;能有效发现感性线圈的选材、焊接、连接部位松动、缺股、断线等制造缺陷和运行后存在的隐患。 为了满足感…

Hive ---- DDL(Data Definition Language)数据定义

Hive ---- DDL&#xff08;Data Definition Language&#xff09;数据定义 1. 数据库&#xff08;database&#xff09;1. 创建数据库2. 查询数据库3. 修改数据库4. 删除数据库5. 切换当前数据库 2. 表&#xff08;table&#xff09;1. 创建表2. 查看表3. 修改表4. 删除表5. 清…

07_阻塞队列(BlockingQueue)

目录 1. 什么是BlockingQueue 2. 认识BlockingQueue 3. 代码演示 栈与队列概念 栈(Stack)&#xff1a;先进后出&#xff0c;后进先出 队列&#xff1a;先进先出 1. 什么是BlockingQueue 在多线程领域&#xff1a;所谓阻塞&#xff0c;在某些情况下会挂起线程&#xff08;即…

JVM 基本知识

目录 前言 一、JVM 内存区域划分 1.1 程序计数器 1.2 栈 1.3 堆 1.4 方法区 二、 JVM 类加载机制 2.1 类加载需要经过的几个步骤 2.1.1 Loading - 加载 2.1.2 Linking - 连接 2.1.3 initialization&#xff08;初始化&#xff09; 小结 经典面试题 三、JVM 垃圾…

天河新一代,安装OpenCV

1&#xff09;下载 Releases opencv/opencv GitHub 下载一个版本&#xff0c;传上去。 解压&#xff0c;因为只要最基本的功能&#xff0c;所以不需要ctri等包。 2&#xff09; 一些选项 cmake .. -D<选项名1><设定值1> -D<选项名2><设定值2> …

Metasploit Framework-安全漏洞检测工具使用

一款开源的安全漏洞检测工具&#xff0c;简称MSF。可以收集信息、探测系统漏洞、执行漏洞利用测试等&#xff0c;为渗透测试、攻击编码和漏洞研究提供了一个可靠平台。 集成数千个漏洞利用、辅助测试模块&#xff0c;并保持持续更新。 由著名黑客、安全专家H.D. Moore主导开发…

Hadoop学习笔记(二)环境配置与服务器克隆

VMware与Centos7的安装 这部分很简单&#xff0c;只需要按照常规步骤一步一步安装即可。最后出现如下画面便完成了。 如果出现了一打开 “开启虚拟机” 就蓝屏的情况。可以试试将VMware更新到16的版本以上。 对虚拟机进行一系列的设置 设置VMware的IP地址 接下来点击 “NAT设…

计算任意时间内课时出现次数以及冲突情况判断

背景 整体由四部分组成&#xff0c;报名时间、报名周期、上课时间、上课周期 通过选择报名时间、报名周期、以及上课时间&#xff0c;去计算在培训周期内总的培训课时&#xff0c;并当上课时间冲突时&#xff0c;给出提示。 需求&#xff1a; 报名时间&#xff08;日期时分&…

分享10个非常好用的绘图工具

无论你是一个专业的插画师&#xff0c;还是一个有创造力的人&#xff0c;想要随时记录生活的灵感&#xff0c;现在你只需要拿起平板电脑或打开电脑浏览器来描述你脑海中的图片。在本文中&#xff0c;我们选择了10个强大、方便、易于使用的在线绘图软件&#xff0c;其中一个必须…

人工智能之配置环境教程一:安装VsCode和Anaconda

人工智能之配置环境教程一&#xff1a;安装VsCode和Anaconda 作者介绍一&#xff0e; 安装VScode编辑器二. 安装Anaconda 作者介绍 孟莉苹&#xff0c;女&#xff0c;西安工程大学电子信息学院&#xff0c;2021级硕士研究生&#xff0c;张宏伟人工智能课题组。 研究方向&#…

语音特征工程—时域分析

当下主流语音前端算法在特征工程方面&#xff0c;从vad&#xff0c;降噪、降混响到盲源分离&#xff0c;无论是传统做法还是NN做法&#xff0c;大多基于频域。但近年在语音分离领域也看到了利用时域的做法&#xff0c;也取得了不错的效果。 本文从特征工程的角度&#xff0c;对…

jQuery购物车案例模块

<div class"car-header"><div class"w"><div class"car-logo"><img src"img/logo.png" alt""> <b>购物车</b></div></div></div></div><div class"c-…

研究了一个多月ChatGPT我发现了这些!!AI时来了?

好久都没有更新过博客了&#xff0c;大一下是真的很忙碌&#xff0c;属实是真的要崩溃了&#xff0c;但是博主还是坚强的活了下来&#xff0c;好了&#xff0c;进入正题&#xff0c;博主使用了一段时间的chatGPT发现真的可能AI时代将要来临&#xff0c;原本以为gpt能做网页已经…

二十三种设计模式第一篇-设计模式的原则和分类

怎么说&#xff0c;其实我挺讨厌设计模式的&#xff0c;但是不得不说&#xff0c;这东西解决问题确实有一手&#xff0c;并且设计模式确实规范了我们在开发中的代码&#xff0c;并且我们可以使用这二十三种设计模式解决我们碰到的业务问题&#xff0c;并且我们学的框架里边多多…

利用Python操作Mysql数据库

我们在进行Python编程的时候&#xff0c;时常要将一些数据保存起来&#xff0c;其中最方便的莫过于保存在文本文件了。但是如果保存的文件太大&#xff0c;用文本文件就不太现实了&#xff0c;毕竟打开都是个问题&#xff0c;这个时候我们需要用到数据库。提到数据库&#xff0…

怎样从零开始编译一个魔兽世界开源服务端Windows

怎样从零开始编译一个魔兽世界开源服务端Windows 第二章&#xff1a;编译和安装 我是艾西&#xff0c;上期我们讲述到编译一个魔兽世界开源服务端环境准备&#xff0c;那么今天跟大家聊聊怎么编译和安装我们直接进入正题&#xff08;上一章没有看到的小伙伴可以点我主页查看&…