当前位置: 首页 > news >正文

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

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

总结

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

相关文章:

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

Qt程序使用路径方式和注意事项 更多精彩内容&#x1f449;个人内容分类汇总 &#x1f448;&#x1f449;Qt开发经验 &#x1f448;文章目录Qt程序使用路径方式和注意事项[toc]前言一、Windows下Qt程序使用路径1.准备工作2.测试结果二、Linux下Qt程序使用路径1.准备工作2.测试结…...

和日期相关的代码和bug——一道力扣题中的小发现

目录 Day of the Week 题目大意 常规方法 Python代码 Golang代码 C代码 基姆拉尔森公式 Python代码 Golang代码 C代码 使用库函数 Python代码 Golang代码 C代码 Day of the Week Given a date, return the corresponding day of the week for that date. The inp…...

如何在2023年学习编程并获得开发者工作

丢下自负 许多进入软件开发领域的人都是从最底层开始的&#xff0c;你可能会获得“初级开发者”的头衔。每天面临的问题是&#xff1a;我有十年的专业经验了。我不是个入门员工。但尽管过去的工作经验丰富&#xff0c;我仍然是个入门级的开发者&#xff0c;我还是个新手。别总…...

Python实战之小说下载神器(三)排行榜所有小说:最全热门小说合集,总有一款适合你,好多好多好多超赞的小说...(源码分享学习)

前言 这次的是一个系列内容 给大家讲解一下何一步一步实现一个完整的实战项目案例系列之 小说下载神器&#xff08;三&#xff09;&#xff08;GUI界面化程序&#xff09; 多线程采集小说下载、采集排行榜所有小说 哈喽&#xff01;大家上午好啦&#xff0c;我是爱看小说的栗子…...

前端监控之用户行为监控实践1(数据收集)

前文对前端监控进行了简单介绍&#xff0c;起因是因为当前做的一个需求&#xff0c;老板要看当前项目的uv、pv信息。其实这是非常简单的统计。 但在最开始接到这个需求&#xff0c;却难倒我了。 现在进行简单的复盘&#xff0c;记录一下实现方法。 一、数据记录 用户行为从大…...

【网络原理7】认识HTTP

目录 一、HTTP协议的位置 二、HTTP协议的特点&应用场景 三、HTTP协议的格式的查看 Fiddler下载与使用 ​编辑 如何查看HTTP请求消息 ​编辑 如何查看HTTP响应数据包 如何默认开启HTTPS的解析功能 四、HTTP的请求数据包的格式含义 第一部分&#xff1a;请求行&…...

SPI实验

目录 一、SPI 简介 二、硬件原理 ECSPI3_SCLK ECSPI3_MISO和ECSPI3_MOSI ECSPI3_SS0 三、I.MX6U ECSPI 简介 ECSPIx_RXDATA ECSPIx_TXDATA ECSPIx_CONREG ECSPIx_CONFIGREG ECSPIx_PERIODREG​编辑 ECSPIx_STATREG 四、ICM-20608 简介 五、代码编写 1、创建文件及文…...

去基线处理

目录detrend函数去除基线多项式拟合原函数BEADS 基线处理小波算法经验模态分解&#xff08;EMD&#xff09;参考detrend函数去除基线 detrend函数只能用于去除线性趋势&#xff0c;对于非线性的无能为力。 函数表达式&#xff1a;y scipy.signal.detrend(x): 从信号中删除线…...

模拟信号4-20mA /0-5V/0-75mV/0-100mV转RS-485/232,数据采集A/D转换模块 YL21

特点&#xff1a;● 模拟信号采集&#xff0c;隔离转换 RS-485/232输出● 采用12位AD转换器&#xff0c;测量精度优于0.1%● 通过RS-485/232接口可以程控校准模块精度● 信号输入 / 输出之间隔离耐压3000VDC ● 宽电源供电范围&#xff1a;8 ~ 32VDC● 可靠性高&#xff0c;编程…...

[USB]键盘数据格式以及按键键值

USB键盘数据包含8个字节 BYTE1 – 特殊按键 |–bit0: Left Control是否按下&#xff0c;按下为1 |–bit1: Left Shift 是否按下&#xff0c;按下为1 |–bit2: Left Alt 是否按下&#xff0c;按下为1 |–bit3: Left GUI&#xff08;Windows键&#xff09; 是否按下&#xff0c;…...

web客户端-websocket

1、websocket简介 WebSocket是HTML5开始提供的一种在单个TCP连接上进行全双工通讯的协议。 WebSocket使得客户端和服务器之间的数据交换变得更加简单&#xff0c;允许服务端主动向客户端推送数据。在WebSocket API中&#xff0c;浏览器和服务器只需要完成一次握手&#xff0c…...

mysql间隙锁

首先我们这里有一个表t&#xff0c;其中的数据如下图所示 注意哈 update由于操作的最新的值&#xff0c;所以是当前读&#xff01; 另外一个事务插入 8的时候发生锁 而我对id为10的数据进行更新&#xff0c;却不会被锁住 分析&#xff1a;在执行当前读时&#xff0c;由于id7不存…...

华为OD机试 - 计算面积(Java) | 机试题+算法思路+考点+代码解析 【2023】

计算面积 绘图机器的绘图笔初始位i在原点(0.0)。 机器启动后其绘图笔按下面规则绘制直线: 1 )尝试沿着横向坐标轴正向绘制直线,直到给定的终点值E, 2 )期间可通过指令在纵坐标轴方向进行偏移。井同时绘制直线,偏移后按规则1绘制直线;指令的格式为X offsetY。表示在横坐标X…...

Python 之 Pandas 时间戳、通过时间间隔实现 datetime 加减、时间转化、时期频率转换和 shift() 时间频率进行移位)

文章目录一、时间戳1. unit 参数是 s2. year、month、day、hour、minute、second、microsecond 单独设置时间二、通过时间间隔实现 datetime 加减三、时间转化1. 处理各种输入格式2. 将字符串转 datetime3. 除了可以将文本数据转为时间戳外&#xff0c;还可以将 unix 时间转为时…...

一篇文章搞定linux网络模型

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

惠普庆祝在中国40年,强化中国发展战略

中国北京&#xff0c;2023年2月23日 ——今日&#xff0c;“品质信赖向未来” 惠普在中国40年系列活动启动仪式及惠普打印春季新品发布会在北京盛大举行。现场&#xff0c;惠普回顾了40年来与中国经济及产业共同发展的历程&#xff0c;并再次强调了惠普一以贯之的“在中国&…...

C++小作业

前言&#xff1a;long long time ago&#xff0c;老大留了点小作业&#xff0c;一直忘了写…偷偷补上 小作业目录unique_ptr vs shared_ptrunique_ptrshared_ptrpublisher/subscriber 1?boost::bindstd::bindthis? _1&#xff1f;TopicContextPtr?std::moveunique_ptr vs sh…...

Python基础 — lambda匿名函数

1、什么是匿名函数&#xff1f; 匿名函数&#xff0c;顾名思义&#xff0c;就是没有名字的函数&#xff0c;它主要用在那些只使用一次的场景中。如果我们的程序中只需要调用一次某个简单逻辑&#xff0c;把它写成函数还需要先定义、取函数名字等一些列操作&#xff0c;这种场景…...

MongoDB安装和使用过程常见问题

文章目录一、安装过程显示没有相应的权限二、pymongo无法使用&#xff0c;报错一、安装过程显示没有相应的权限 oh我的天&#xff0c;找了网上很多种方法都不行哈哈 不同的电脑对应不同的问题吧~ 我的这个问题是这样解决滴 先直接简述操作路径&#xff0c;不明白的可以看如下图…...

AWS攻略——使用中转网关(Transit Gateway)连接同区域(Region)VPC

文章目录环境准备创建VPC配置中转网关给每个VPC创建Transit Gateway专属挂载子网创建中转网关创建中转网关挂载修改VPC的路由验证创建业务Private子网创建可被外网访问的环境测试子网连通性Public子网到Private子网Private子网到Private子网知识点参考资料在《AWS攻略——Peeri…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...