1 头文件:
#include <QStandardPaths>
2 详细说明
-
QStandardPaths
类提供用于访问标准路径
的方法,该类包含用于查询本地文件系统上的标准位置的函数,用于常见任务,如特定于用户的目录或系统范围的配置目录。 -
所谓系统标准路径:指的是
本地文件系统
中,用户特定目录
或者系统的配置目录
,比如在window系统中的“我的文档”
、“视频”
等目录位置 -
对于系统标准目录,我们可以认定它是必然存在的(即使不存在,也可自动创建),但是不同的操作系统,可能有不一样的系统标准目录。例如“我的文档”目录位置
Windows:C:/Users//Documents
MacOs :~/Documents
Linux : ~/Documents
Android :/Documents,//Documents
IOS :/Documents
Qt却给我们提供了非常方便的类来获取这些标准目录路径,它就是今天要介绍的QStandardPaths类。
这些接口均为静态函数
3 成员类型
3.1 LocateOption&&LocateOptions
该枚举描述了可用于控制QStandardPaths::locate和QStandardPaths::locateAll的行为的不同标志。
值 | 说明 |
---|---|
QStandardPaths::LocateFile | 0x0 只返回文件 |
QStandardPaths::LocateDirectory | 0x1 只返回目录 |
LocateOptions类型是QFlags 的typedef 。它存储LocateOption值的OR组合。 |
3.2 QStandardPaths :: StandardLocation
-
该枚举描述了可以使用诸如
QStandardPaths::writableLocation
,QStandardPaths::standardLocations
,QStandardPaths::displayName
.之类的方法查询的不同位置。 -
该枚举中的某些值表示用户配置。这样的枚举值将在不同的应用程序中返回相同的路径,因此它们可用于与其他应用程序共享数据。其他值特定于此应用程序。下表中的每个枚举值都描述了它是特定于应用程序的还是通用的。
-
特定于应用程序的目录应假定为其他应用程序无法访问。因此,即使由同一用户运行,放置在此处的文件也可能无法被其他应用程序读取。另一方面,应假定通用目录可由该用户运行的所有应用程序访问,但仍应假定其他用户的应用程序无法访问通用目录。
与其他用户的数据交换不在QStandardPaths的范围内。
值 | 说明 |
---|---|
QStandardPaths::DesktopLocation | 0 返回用户的桌面目录。这是一个通用值。在没有桌面概念的系统上,这与QStandardPaths :: HomeLocation相同。 |
QStandardPaths::DocumentsLocation | 1 返回包含用户文档文件的目录。这是一个通用值。返回的路径永远不会为空。 |
QStandardPaths::AppDataLocation | 17 返回可以存储持久性应用程序数据的目录位置。这是一个特定于应用程序的目录。要获取存储要与其他应用程序共享的数据的路径,请使用QStandardPaths :: GenericDataLocation。返回的路径永远不会为空。在Windows操作系统上,这将返回漫游路径。这个枚举值是在Qt 5.4中添加的。 |
QStandardPaths::AppConfigLocation | 18 返回应在其中写入用户特定配置文件的目录位置。这是一个特定于应用程序的目录,并且返回的路径永远不会为空。这个枚举值是在Qt 5.5中添加的。 |
下表提供了不同操作系统上路径的示例。第一条路径是可写路径(除非另有说明)。其他其他路径(如果有)表示不可写的位置。 | |
-
在上面的表中,
<APPNAME>
通常是组织名称、应用程序名称,或者是打包时生成的唯一名称。类似地,<APPROOT>
是这个应用程序安装的位置(通常是一个沙箱)。<APPROOT>
是包含应用程序可执行文件的目录。 -
上面的路径不应该被依赖,因为它们可能会根据OS配置、语言环境或将来的Qt版本而改变。
-
注意:在Android上,如果卸载了外部存储,则在外部存储(位置)上具有打开文件的应用程序将被杀死。
-
注意:在Android 6.0(API 23)或更高版本上,使用QStandardPaths :: writableLocation或QStandardPaths :: standardLocations时,必须在运行时请求“ WRITE_EXTERNAL_STORAGE”权限。
-
注意:在Android上,对GenericDataLocation进行读/写操作需要授予READ_EXTERNAL_STORAGE / WRITE_EXTERNAL_STORAGE权限。
-
注意:在iOS上,如果确实将QStandardPaths::standardLocations(QStandardPaths::PicturesLocation).last()参数作为参数传递给QFileDialog :: setDirectory(),则将使用本机图像选择器对话框来访问用户的相册。可以使用QFile和相关API加载返回的文件名。此功能已在Qt 5.5中添加。
-
另请参见writableLocation(),standardLocations(),displayName(),locate()和locateAll()。
4 示例代码
void CHardwareLogWidget::onExport()
{
// QSettings https://doc.qt.io/qt-5/qsettings.html#QSettings
QSettings settings("Gennius Pro", "geniusclient");
QString strPreFilePath = settings.value("HardWare Log Export Route").toString();
// 初次是空的,默认打开路径为桌面 获取默认的文档路径
if (strPreFilePath.isEmpty())
{
strPreFilePath = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation);
}
QString filePath = QFileDialog::getExistingDirectory(this, tr("Please select file path..."), strPreFilePath, QFileDialog::ReadOnly);
if (!filePath.isEmpty())
{
settings.setValue("HardWare Log Export Route", filePath);
std::vector<HardWareOperateLogStr> vector = this->getFilterLog();
CLogExportTask* pTask = new(std::nothrow) CLogExportTask(filePath, vector);
if (nullptr != pTask)
{
pTask->setHeader(QString("%1,%2,%3,%4").arg(tr("Operate Time")).arg(tr("User name")).arg(tr("Operate Type")).arg(tr("Operate Detail")));
base::CNormalMessageLoop::instance()->postTask(pTask);
}
}
}