Qt程序使用路径方式和注意事项

news/2024/5/19 7:59:37/文章来源:https://blog.csdn.net/qq_43627907/article/details/129185368

Qt程序使用路径方式和注意事项

更多精彩内容
👉个人内容分类汇总 👈
👉Qt开发经验 👈

文章目录

  • Qt程序使用路径方式和注意事项
    • @[toc]
  • 前言
  • 一、Windows下Qt程序使用路径
    • 1.准备工作
    • 2.测试结果
  • 二、Linux下Qt程序使用路径
    • 1.准备工作
    • 2.测试结果
  • 三、系统路径
  • 四、主要代码
  • 五、源代码
  • 总结

前言

  • 在程序开发中我们会经常使用到路径功能,例如:读取./路径下的配置文件,将日志文件、运行数据保存到当前路径,将视频文件保存到系统的视频文件夹下等;
  • 很多人开发时图方便就使用相对路径,然后用户使用时程序就出问题了,这就需要文件路径指定正确了,否则就会开发不规范,调试两行泪;
  • 路径分为相对路径、绝对路径;
  • 在Windows下文件/文件夹又有实际路径,快捷方式路径;
  • 在Linux下文件/文件夹又有实际路径,软/硬链接路径;
  • 程序运行方式有Qt编译运行,双击可执行程序运行,双击快捷方式运行,命令行./运行等;
  • 这些不同的组合就会导致使用的路径存在不同的情况,也决定了你写的程序能不能正常的运行,所以我就整理了一下Qt中使用路径的方式和注意事项,避免以后程序出现问题。
  • 实际开发中使用相对路径不是很安全,使用绝对路径又由于不同的电脑中路径不一定相同,所以最好的方式是将相对路径根据系统环境不同、运行方式不同转为绝对路径,或者使用系统中的默认路径(例如图片/视频/文件/下载/用户)。

在Qt中可通过QDir、QFileInfo、QStandardPaths、QCoreApplication、QApplication、qApp来获取不同的路径。

一、Windows下Qt程序使用路径

1.准备工作

  • 程序编译后,可执行程序会输出到bin64文件夹下;

    • 将可执行程序UsePath.exe创建一个快捷方式到桌面;
    • 在桌面创建一个文件夹(桌面文件夹),然后在这个文件夹中创建一个文件(1.xlsx);
    • 将【桌面文件夹】创建一个快捷方式到当前路径下。

    在这里插入图片描述

2.测试结果

  • 分别使用Qt编译运行程序、双击可执行程序运行、双击快捷方式、cmd命令行运行四种方式运行UsePath程序;

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

  • 通过对比可以看出前三种运行方式没有什么区别,命令行运行时程序的当前路径为命令行窗口当前路径

    • 所以如果使用命令行启动程序,程序中使用到相对路径的地方就会有问题。
  • 如果路径是快捷方式,使用canonicalPath()无法获取路径,会返回空字符串,而使用absolutePath()可以获取快捷方式的绝对路径;

二、Linux下Qt程序使用路径

1.准备工作

  • 程序编译后,可执行程序会输出到bin64文件夹下;

    • 在桌面创建一个文件夹(桌面文件夹),然后在这个文件夹中创建一个文件(1.xlsx);
    • 在bin64文件夹下使用命令ln -s ~/桌面/桌面文件夹/ ./桌面文件夹-软链接 创建一个软连接到当前路径下;
    • 在程序中QDir、QFileInfo设置软连接的路径。

    在这里插入图片描述

2.测试结果

  • 由于我测试使用的是ubuntu,程序默认不能双击运行(需要配置桌面xxx.desktop文件才可以,如果是麒麟这些系统支持双击运行),所以就测试编译运行、命令行运行两种方式;
  • 命令行启动如下图所示
    • 用户路径下使用命令Code/bin64/UsePath运行程序,程序当前路径(相对路径./)是用户目录;
    • 由于【桌面文件夹-软连接】是在Code/bin64/目录下,所以在其它路径下使用命令行启动是找不到当前路径下的文件的,这种情况下使用相对路径就会出问题
  • Qt编译运行启动如下图所示

    • 由Qt编译运行方式启动程序,当前路径(相对路径./)是在可执行程序所在路径
    • 所以使用相对没有问题,可以找到【桌面文件夹-软连接】;
    • 在Linux下使用absolutePath()获取软连接的绝对路径是软连接文件所在路径
    • 在Linux下使用canonicalPath()获取软连接的绝对路径是软连接指向文件的实际所在路径

    在这里插入图片描述

三、系统路径

有时候我们需要将文件保存到系统路径下,例如:

  • 将截图保存到系统的图片文件夹;
  • 将视频文件保存到系统的视频文件夹;
  • 将下载的文件保存到系统的下载文件夹;
  • 将文件保存到桌面路径;
  • 但是Windows、Linux、MacOS的这些文件夹路径都不相同;
  • 不同用户的路径也不相同;
  • 想要获取这些路径怎么办呢,Qt提供了QStandardPaths类。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

四、主要代码

#include "widget.h"
#include "ui_widget.h"#include <QDebug>
#include <QDir>
#include <QFileInfo>
#include <QMetaEnum>
#include <QStandardPaths>
#include <QPair>
#include <QList>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);this->setWindowTitle(QString("Qt使用路径的方式和注意使用 V%1").arg(APP_VERSION));QList<QPair<QString, QString>> paths;paths << QPair<QString, QString>("QDir::currentPath()", QDir::currentPath());    // 返回应用程序当前目录的绝对路径paths << QPair<QString, QString>("QDir::homePath()", QDir::homePath());          // 返回用户主目录的绝对路径paths << QPair<QString, QString>("QDir::rootPath()", QDir::rootPath());          // 返回根目录的绝对路径// Windows下创建一个文件夹快捷方式或linux下创建一个文件夹链接,将快捷方式路径写入下列QDirQDir dir("./桌面文件夹 - 快捷方式");   // 指定一个路径paths << QPair<QString, QString>("QDir::path()", dir.path());                    // 返回输入路径,返回的路径可以是绝对路径或相对路径paths << QPair<QString, QString>("QDir::absolutePath()", dir.absolutePath());    // 返回绝对路径(不区分是不是快捷方式/linux链接 ln)// 如果是真实路径,效果和absolutePath()相同,如果是windows快捷方式则返回空,如果是linux软硬链接则返回路径地址的实际路径paths << QPair<QString, QString>("QDir::canonicalPath()", dir.canonicalPath());paths << QPair<QString, QString>("QCoreApplication::applicationDirPath()", QCoreApplication::applicationDirPath());  // 返回包含应用程序可执行文件的目录paths << QPair<QString, QString>("qApp->applicationDirPath()", qApp->applicationFilePath());      // 返回应用程序可执行文件的文件路径// Windows下创建一个文件快捷方式或linux下创建一个文件链接,将快捷方式路径写入下列QDirQFileInfo info("./桌面文件夹 - 快捷方式/1.xlsx");// 如果是真实路径,效果和absolutePath()相同,如果是windows快捷方式则返回空,如果是linux软硬链接则返回路径地址的实际路径paths << QPair<QString, QString>("QFileInfo::canonicalPath()", info.canonicalPath());paths << QPair<QString, QString>("QFileInfo::canonicalFilePath()", info.canonicalFilePath());paths << QPair<QString, QString>("QFileInfo::absolutePath()", info.absolutePath());             // 返回输入文件的绝对路径(不包含文件名)paths << QPair<QString, QString>("QFileInfo::absoluteFilePath()", info.absoluteFilePath());     // 返回输入文件的绝对路径paths << QPair<QString, QString>("QFileInfo::filePath()", info.filePath());                     // 返回文件名,包括路径(可以是绝对路径或相对路径)paths << QPair<QString, QString>("QFileInfo::path()", info.path());                             // 返回文件的路径。这不包括文件名paths << QPair<QString, QString>("", "--------返回给定位置类型的本地化显示名称--------");QMetaEnum m = QMetaEnum::fromType<QStandardPaths::StandardLocation>();for(int i=0; i < m.keyCount(); ++i){QStandardPaths::StandardLocation location = QStandardPaths::StandardLocation(m.value(i));// 返回给定位置类型的本地化显示名称,如果找不到相关位置,则返回空QString。paths << QPair<QString, QString>(m.valueToKey(m.value(i)), QStandardPaths::displayName(location));}paths << QPair<QString, QString>("", "--------返回类型文件应写入的目录--------");for(int i=0; i < m.keyCount(); ++i){QStandardPaths::StandardLocation location = QStandardPaths::StandardLocation(m.value(i));// 返回类型文件应写入的目录,如果无法确定位置,则返回空字符串。paths << QPair<QString, QString>(m.valueToKey(m.value(i)), QStandardPaths::writableLocation(location));}for(int i = 0; i < paths.count(); i++){ui->tableWidget->insertRow(i);		//按需求加行ui->tableWidget->setItem(i, 0, new QTableWidgetItem(paths.at(i).first));   // 插入第一列数据ui->tableWidget->setItem(i, 1, new QTableWidgetItem(paths.at(i).second));  // 插入第二列数据}//自适应宽度ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);ui->tableWidget->horizontalHeader()->setSectionResizeMode(0, QHeaderView::ResizeToContents);
}Widget::~Widget()
{delete ui;
}

五、源代码

  • github
  • gitee

总结

程序开发中细节决定成败,相对路径、绝对路径不是我们想的那么简单。
整理的路径使用方式和注意事项就到这里,如果有不足欢迎私信我。

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

6 Namespace,分组和DataID三者之间的关系

命名空间&#xff08;Namespace&#xff09; 用于进行租户粒度的配置隔离。不同的命名空间下&#xff0c;可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离&#xff0c;例如开发测试环境和生产环境的资源&#xff08;如配置、服务…

2022年工程机械出口专题研究【重工】

文章目录2022年工程机械出口专题研究1、中国是全球工程机械第一大市场&#xff0c;竞争力逐步提升2、工程机械出口高增&#xff0c;市场分布趋于多元&#xff0c;企业营收获益3、海外市场高速增长原因为何&#xff1f;4、海外市场增长动能预测附件&#xff1a;2022年工程机械出…

Windows下载安装Redis的详细步骤

目录 一、概述 1.redis的版本维护介绍 2.msi安装包和压缩包的优点和缺点 二、操作步骤 三、测试是否安装成功&#xff08;查看版本&#xff09; 四、获取资源 一、概述 1.redis的版本维护介绍 Redis的官网只提供Linux系统的下载。但是微软的技术团队长期开发和维护着这…

MySQL 11:MySQL锁

锁是一种机制&#xff0c;计算机通过这种机制协调多个进程或线程对资源的并发访问&#xff08;以避免争用&#xff09;。在数据库中&#xff0c;除了传统的计算资源&#xff08;如CPU、RAM、I/O等&#xff09;的争夺外&#xff0c;数据也是一种被众多用户共享的资源。如何保证并…

二氧化碳地质封存技术应用前景及模型构建实践方法与讨论

2022年七月七日&#xff0c;工业和信息化部、发展改革委、生态环境部关于印发工业领域碳达峰实施方案的通知落地。全国各省份积极响应&#xff0c;纷纷出台地方指导文件&#xff0c;标志着我国碳减排事业的全面铺开。二氧化碳地质封存技术作为实现我国“双碳”目标的重要一环&a…

浅析无人值守+智慧巡检变电站安全管控系统设计方案

一、项目背景 安全是电力生产的基石&#xff0c;确保电网安全和人身安全&#xff0c;是电网企业安全工作的出发点和落脚点。 随着智能信息化技术应用越来越广泛&#xff0c;智能信息化现场安全管理是近年来基于智能安全巡检技术下发展起来的现场作业安全管理新技术。 变电站运…

3.【Linux】安装 elasticsearch-7.10.0 单机版

1.下载 版本 JDK 11ES elasticsearch-7.10.0 jdk安装 下载&#xff1a; wget https://download.java.net/openjdk/jdk11/ri/openjdk-1128_linux-x64_bin.tar.gz配置环境变量&#xff1a;# 编辑配置文件 vim /etc/profile# Java11环境变量配置 export JAVA_HOME/devtools/ja…

ROS2手写接收IMU数据(Imu)代码并发布

目录前言接收IMU数据IMU的串口连接问题python接收串口数据python解析数据ROS2发布IMU数据可视化IMU数据效果前言 在前面测试完了单独用激光雷达建图之后&#xff0c;一直想把IMU的数据融合进去&#xff0c;由于经费的限制&#xff0c;忍痛在淘宝上买了一款便宜的IMU—GY95T&am…

某直聘tp_token解析

尊重版权&#xff0c;请勿盗版&#xff0c;不放代码。截至2023-02-23更新---------------------------------------检测windows属性总数大于150 改成大于15 > 150检测了document属性大于50检测了navigate属性检测了navigate.plugins 属性值检测moudle nodejs是否存在&#x…

前端开发:JS中深拷贝和浅拷贝的区别

前言 前端开发中&#xff0c;关于JS原生的原理使用是前端开发者的看家本领&#xff0c;尤其是关于底层和原理的掌握使用&#xff0c;甚为重要。而且编程语言有一些比较共性的概念在不同的编程语言中会有相同的概念&#xff0c;比如深拷贝和浅拷贝它们不仅在JS中有&#xff0c;在…

Prometheus之Alertmanager告警

告警流程 Prometheus主要是提供了数据的采集和存储&#xff0c;Alertmanager组件主要实现告警功能。Alertmanager 主要用于接收 Prometheus 发送的告警信息&#xff0c;它支持丰富的告警通知渠道&#xff0c;而且很容易做到告警信息进行去重&#xff0c;降噪&#xff0c;分组等…

双碳”目标下二氧化碳地质封存技术应用前景及模型构建实践方法

2022年七月七日&#xff0c;工业和信息化部、发展改革委、生态环境部关于印发工业领域碳达峰实施方案的通知落地。全国各省份积极响应&#xff0c;纷纷出台地方指导文件&#xff0c;标志着我国碳减排事业的全面铺开。二氧化碳地质封存技术作为实现我国“双碳”目标的重要一环&a…

易点易动助力企业固定资产信息化管理

对于生产制造或者互联网企业而言&#xff0c;固定资产比重较高&#xff0c;是企业资产的大头&#xff0c;一些办公设备、生产设备数量和金额都比较大。提升企业固定资产管理水平&#xff0c;是企业实现信息化建设的必要条件。 目前&#xff0c;国内的很多企业在固定资产管理中…

一口吃不成ChatGPT,复旦版MOSS服务器被挤崩后续

ChatGPT 是目前最先进的 AI&#xff0c;由于 ChatGPT 的训练过程所需算力资源大、标注成本高&#xff0c;此前国内暂未出现对大众开放的同类产品。 适逢ChatGPT概念正火&#xff0c;2 月 21 日&#xff0c;复旦团队发布首个中国版类 ChatGPT 模型「MOSS」&#xff0c;没想到瞬时…

编译原理【运行时环境】—什么是活动记录、 活动记录与汇编代码的关系

系列文章戳这里&#x1f447; 什么是上下文无关文法、最左推导和最右推导如何判断二义文法及消除文法二义性何时需要消除左递归什么是句柄、什么是自上而下、自下而上分析什么是LL(1)、LR(0)、LR(1)文法、LR分析表LR(0)、SLR(1)、LR(1)、LALR(1)文法之间的关系编译原理第三章习…

扬帆优配|翻倍牛股“高台跳水”,一度跌停,啥情况

2月23日上午&#xff0c;A股商场窄幅震荡&#xff0c;上证指数上午收盘涨0.07%&#xff0c;煤炭、电力设备等板块领涨。 总的来看&#xff0c;A股商场上午整体体现安静&#xff0c;不过仍有个股大幅动摇&#xff0c;比如前期翻倍热门股汉王科技盘中“高台跳水”&#xff0c;一…

JS - 原型对象、原型链是什么

一 阅读掘金 https://juejin.cn/post/7007416743215759373 https://juejin.cn/post/7007416743215759373 二 阅读掘金小册原型知识点 原型 涉及面试题&#xff1a;如何理解原型&#xff1f;如何理解原型链&#xff1f; 当我们创建一个对象时 let obj { age: 25 }&#xff0…

一篇文章搞定linux网络模型

网络协议感觉晦涩难懂&#xff1f;什么七层网络模型&#xff1f;又五层网络模型&#xff1f;又四层网络模型&#xff1f;TCP/IP协议是个啥&#xff1f;UDP是啥&#xff1f;什么是三次握手&#xff1f;什么是四次挥手&#xff1f;tcpdump听说是抓包的&#xff0c;怎么用&#xf…

Docker 容器命令 和安装各种镜像环境

CentOS安装Docker 1.1.卸载&#xff08;可选&#xff09; 如果之前安装过旧版本的Docker&#xff0c;可以使用下面命令卸载&#xff1a; yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotat…

SCG failure information

我们知道5G网络有独立组网和非独立组网&#xff0c;独立组网中不论是核心网还是接入网都是5G&#xff0c;但是部署成本高&#xff1b;非独立组网也就是双连接(MRDC)也是目前比较流行的一种方式&#xff0c;其中的ENDC&#xff0c;即E-UTRA-NRDual Connectivity&#xff0c;是将…