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

news2024/11/23 16:42:24

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下创建一个文件夹链接,将快捷方式路径写入下列QDir
    QDir 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下创建一个文件链接,将快捷方式路径写入下列QDir
    QFileInfo 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.coloradmin.cn/o/365888.html

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

相关文章

Python如何实现自动登录和下单的脚本,请看selenium的表演

前言 学python对selenium应该不陌生吧 Selenium 是最广泛使用的开源 Web UI&#xff08;用户界面&#xff09;自动化测试套件之一。Selenium 支持的语言包括C#&#xff0c;Java&#xff0c;Perl&#xff0c;PHP&#xff0c;Python 和 Ruby。目前&#xff0c;Selenium Web 驱动…

某餐厅系统网络故障分析案例

背景 针对食堂经营企业&#xff0c;某堂食软件为客户提供优化堂食就餐流程、提高食堂服务水平和管理效率。 某上海客户使用该堂食系统&#xff0c;在就餐高峰时段&#xff0c;总是出现支付、点餐等操作缓慢&#xff0c;动辄一个操作需要等待几十秒。该客户联系软件厂商&#…

浮点数在内存中的存储——“C”

各位CSDN的uu们你们好呀&#xff0c;今天&#xff0c;小雅兰的内容是浮点数在内存中的存储&#xff0c;昨天我们已经写过了整型在内存中的存储&#xff0c;那么&#xff0c;浮点数在内存中是怎样存储的呢&#xff1f;现在&#xff0c;就让我们进入浮点数在内存中的存储的世界吧…

超实用的公众号运营攻略分享,纯干货

很多小伙伴抱怨&#xff0c;公众号运营真的越来越难做了&#xff01; 每天会因为少得可怜的阅读量发愁&#xff0c;每天会因为纠结写什么选题发愁&#xff0c;每天更会因为公众号没有什么起色而感到无力。 现阶段公众号运营趋于饱和状态&#xff0c;公众号创建门槛低&#xf…

在Pandas中通过时间频率来汇总数据的三种常用方法

当我们的数据涉及日期和时间时&#xff0c;分析随时间变化变得非常重要。Pandas提供了一种方便的方法&#xff0c;可以按不同的基于时间的间隔(如分钟、小时、天、周、月、季度或年)对时间序列数据进行分组。 在Pandas中&#xff0c;有几种基于日期对数据进行分组的方法。我们将…

spark08-spark任务启动环境准备

内容来自尚硅谷1.submitApplication当spark执行任务时会启动java虚拟机&#xff0c;启动一个进程&#xff0c;该进程的名称为SparkSubmit&#xff0c;会执行SparkSubmit中的main方法&#xff0c;该方法中调用了super.doSubmit方法。org.apache.spark.deploy.SparkSubmitdoSubmi…

Python abs() 函数

Python abs() 函数Python 数字描述abs() 函数返回数字的绝对值。语法以下是 abs() 方法的语法:abs( x )参数x -- 数值表达式。返回值函数返回x&#xff08;数字&#xff09;的绝对值。实例以下展示了使用 abs() 方法的实例&#xff1a;#!/usr/bin/python print "abs(-45) …

百度西交大大数据菁英班目标检测竞赛

来源&#xff1a;投稿 作者&#xff1a;LSC 编辑&#xff1a;学姐 数据介绍 数据集共包括40000张训练图像和1000张测试图像&#xff0c;每张训练图像对应xml标注文件&#xff1a; 共包含3类&#xff1a;0:head, 1:helmet, 2:person。 提交格式要求&#xff0c;提交名为pred_r…

如何为Java文件代码签名及添加时间戳?

Java是一种流行的编程语言&#xff0c;大多数组织都使用它来开发业务应用程序。由于其高使用率&#xff0c;攻击者总是试图找到其中的漏洞并基于它利用软件。为了防止此类攻击&#xff0c; 为 Java 文件&#xff08;.jar&#xff09;进行代码签名并添加时间戳&#xff0c;可以防…

Netty网络编程实战:基于Netty的Http服务器开发

Netty网络编程实战&#xff1a;基于Netty的Http服务器开发 文章目录Netty网络编程实战&#xff1a;基于Netty的Http服务器开发介绍功能需求服务端代码实现基于Netty的WebSocket开发网页版聊天室WebSocket简介WebSocket和HTTP的区别基础环境准备服务端开发Netty中粘包和拆包的解…

关于PHP的webshell免杀小结

0X00普通的一句话木马&#xff08;适用于CTF和小站&#xff09; <?php eval($_POST[a]); ?> //函数的相似替换 <?php assert($_POST[a]); ?><?php eval($_POST[110]);?>与第一个一句话木马相比多了一个"“字符&#xff0c;我们发现这个字符的含义…

【科研】测试速通:python不同文件夹下同名图像拼接

论文必备图像拼接笔记 速通结果&#xff1a; 现有&#xff1a;测试样本相同&#xff08;名命相同&#xff09;&#xff0c;测试模型不同&#xff0c;测试结果分别保存至不同文件夹 目标&#xff1a;结果显示在同一张图像上 目录 论文必备图像拼接笔记 1.如果图像格式不一致…

怎么维护Linux VPS 服务器?简单7个步骤

维护VPS的目的是为了确保服务器网络始终畅通无阻。请注意&#xff0c;此列表中的任务并不是服务器维护所需完成的唯一任务。以下是 Linux VPS 服务器所有者可以做些什么来维护他们的服务器。 1.监控磁盘空间 服务器是个人服务器还是具有多个用户帐户的服务器并不重要&#xff0…

精简版SDL落地实践

一、前言一般安全都属于运维部下面&#xff0c;和上家公司的运维总监聊过几次一些日常安全工作能不能融入到DevOps中&#xff0c;没多久因为各种原因离职。18年入职5月一家第三方支付公司&#xff0c;前半年在各种检查中度过&#xff0c;监管形势严峻加上大领导对安全的重视(主…

【数据结构】二叉树(C语言实现)

文章目录一、树的概念及结构1.树的概念2.树的相关概念名词3.树的表示4.树在实际中的运用二、二叉树概念及结构1.二叉树的概念2.特殊的二叉树3.二叉树的性质4.二叉树的存储结构三、二叉树链式结构的实现1.结构的定义2.构建二叉树3.二叉树前序遍历4.二叉树中序遍历5.二叉树后序遍…

QWebEngineView 类 详细使用说明

文章目录 一、前言 二、详述 三、属性 四、公共函数 五、重新实现的公共函数 六、公共槽函数 七、信号 八、保护函数 九、重新实现的受保护函数 10、总结 一、前言 原文链接 QWebEngineView类提供了一个小部件&#xff0c;用于查看和编辑Web文档。 Header: #include < …

【Web安全-MSF记录篇章一】

文章目录前言msfvenom生成远控木马基本系统命令webcam 摄像头命令常用的信息收集脚本注册表设置nc后门开启 rdp&添加用户获取哈希mimikatz抓取密码前言 最近打站&#xff0c;可以感觉到之前的学的渗透知识忘记很多。。。。。多用多看多练&#xff0c;简单回顾一下 msfven…

2023年了,零基础小白转行IT学习Java还有前途吗?

“2023年了&#xff0c;转行IT学习Java是不是已经听过看过很多次了&#xff0c;Java从出现到现在有多少年了呢&#xff1f;掐指一算&#xff0c;Java是1995年由Sun公司推出的一款高级编程语言……距今已有28年了&#xff01; Sun公司都被收购了&#xff0c;莫不是Java也要垮台了…

Android实现Dribbble上动感的Gallery App Icon

先来看看原Dribbble上动感的Gallery App Icon效果图思路拆解一下&#xff0c;还是比较简单&#xff0c;需要绘制的有&#xff1a;圆形背景太阳(圆形)山(三角形)云朵(圆角矩形 三个圆)需要进行的动画&#xff1a;太阳 - 旋转动画山 - 上下平移动画云朵 - 左右平移动画不必绘制圆…

随想录二刷 (双指针法) leetcode 27 26 283 844

双指针法的原理 双指针法相对于暴力解法的优点有以下几点 暴力遍历的时间复杂度会比较高双指针法利用两个指针进行遍历完成双层循环所做的事情 双指针一般有两种方法 同向指针&#xff0c;双向指针 第一题 leetcode 27 移除元素 题目描述 题目分析 采用暴力遍历可以得出结…