Qt 程序获取执行路径等各种路径方法

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

Qt 程序获取程序所在路径、用户目录路径、临时文件夹等特殊路径的方法


Qt 项目获取程序所在路径、用户目录路径、临时文件夹等特殊路径的方法。
在我们的开发过程中经常需要访问一些特殊的路径比如程序所在的路径、用户目录路径、临时文件夹等。
在 Qt 中实现这几个功能所用的方法虽然都不难但是各不相同每次用到时还要现去查很不方便以下是各种路径的实现方式。

程序所在路径

获取程序所在路径QCoreApplication 类里就实现了相关的功能

QString QCoreApplication::applicationDirPath();

比如我们有一个程序在

C:/Qt/test/test.exe

那么 qApp->applicationDirPath() 的结果是

C:/Qt/test

如果除了程序所在路径我们还想要程序的完整名称。那么可以这么写

qApp->applicationFilePath();

还是上面的例子结果是

C:/Qt/test/test.exe

当前工作目录

QDir 提供了一个静态函数 currentPath() 可以获取当前工作目录函数原型如下

QString QDir::currentPath()

如果我们是双击一个程序运行的那么程序的工作目录就是程序所在目录。
如果是在命令行下运行一个程序那么运行程序时在命令行的哪个目录那个目录就是当前目录。

用户目录路径

Qt 4 中的方法。
下面的方法只对 Qt 4 有效Qt 5 已经删除了 storageLocation() 方法。

QDesktopServices::storageLocation(QDesktopServices::HomeLocation);

Qt 5 中引入的方法:

QStandardPaths::writableLocation(QStandardPaths::HomeLocation);

或者

QStandardPaths::standardLocations(QStandardPaths::HomeLocation);

这两个方法的区别是 standardLocations() 返回值是 QStringList。当然对于 HomeLocation 来说这个 QStringList 中只有一个 QString。
还有另外一种方法利用 QDir 类的一个静态函数

QDir::homePath();

执行上面的程序结果是

C:/Users/Administrator

我的文档路径

Qt 4 中的方法。
下面的方法只对 Qt 4 有效Qt 5 已经删除了 storageLocation() 方法。

QDesktopServices::storageLocation(QDesktopServices::DocumentsLocation);

Qt 5 中引入的方法。

QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation);
QStandardPaths::standardLocations(QStandardPaths::DocumentsLocation);

执行上面的程序结果是

C:/Users/Administrator/Documents

桌面路径

Qt 4 中的方法。
下面的方法只对 Qt 4 有效Qt 5 已经删除了 storageLocation() 方法。

QDesktopServices::storageLocation(QDesktopServices::DesktopLocation);

Qt 5 中引入的方法。

QStandardPaths::writableLocation(QStandardPaths::DesktopLocation);
QStandardPaths::standardLocations(QStandardPaths::DesktopLocation);

执行上面的程序结果是

C:/Users/Administrator/Desktop

程序数据存放路径

通常我们会将程序所需的一些数据存入注册表。但是有时需要存储的数据太多放在注册表中就不适合了。这时我们就要找个专门的地方来放数据。以前我喜欢将数据直接放到程序所在目录但是后来发现我的程序运行时经常没有权限对这个目录下的文件进行写操作。后来发现其实 Qt 早就替我们考虑过这些问题了。
Qt 4 中的方法。
下面的方法只对 Qt 4 有效Qt 5 已经删除了 storageLocation() 方法。

QDesktopServices::storageLocation(QDesktopServices::DataLocation);

Qt 5 中引入的方法。

QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);
QStandardPaths::standardLocations(QStandardPaths::AppDataLocation);

Qt 5.5 中引入了另一种方法

QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation);
QStandardPaths::standardLocations(QStandardPaths::AppConfigLocation);

这个方法一般来说和上面的方法得到的结果是相同的。按照 Qt 帮助文档的解释这个方法可以确保返回的路径非空。所以我认为应该优先选用这个方法。
执行上面的程序结果是

QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);

临时文件路径

Qt 4 中的方法。
下面的方法只对 Qt 4 有效Qt 5 已经删除了 storageLocation() 方法。

QDesktopServices::storageLocation(QDesktopServices::TempLocation);

Qt 5 中引入的方法。

QStandardPaths::writableLocation(QStandardPaths::TempLocation);
QStandardPaths::standardLocations(QStandardPaths::TempLocation);

更传统的方法是利用 QDir 的一个静态函数 tempPath()。

QDir::tempPath();

执行上面的程序结果是

C:/Users/Administrator/AppData/Local/Temp

在这个目录下生成临时文件和临时目录需要用到另外两个类 QTemporaryFile 和 QTemporaryDir。大家可以参考 qt 的帮助文档。

QTemporaryFile

QTemporaryFile类是操作临时文件的I/O设备。
QTemporaryFile用于安全地创建一个独一无二的临时文件。临时文件通过调用open()来创建并且名称是唯一的即保证不覆盖现有文件该临时文件将随着QTemporaryFile对象的析构被删除。这是一个重要的技术避免了存储在临时文件的应用程序数据损坏。文件名可以自动生成也可以基于模板传参至QTemporaryFile的构造函数创建。
通过以下可以获取该项目的临时文件

QTemporaryFile file;
    if (file.open()) {
        cout << file.fileName();//  returns the unique file name
    }

QTemporaryDir

QTemporaryDir用于安全地创建唯一的临时目录。目录本身是由构造函数创建的。临时目录的名称保证是唯一的即保证不覆盖现有目录并且在销毁QTemporaryDir对象后该目录随后将被删除。目录名称是自动生成的或者是基于模板创建的该模板被传递给QTemporaryDir的构造函数。
以下是QTemporaryDir用法

QTemporaryDir dir;
    if (dir.isValid()) {
        // dir.path() returns the unique directory path
    }

注意在创建对象后一定要使用isValid()来检查创建临时目录是否有效。不要使用exists()因为默认构造的QDir代表当前存在的目录。
通过调用path可以找到临时目录的路径。
至此常用的各种特殊路径就介绍的差不多了。剩下还有些不常用的可以参考 QStandardPaths 类的介绍。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6