QFileSelector 类
QFileSelector 提供了一种方便的方式选择文件变体。 更多...
头文件 | #include <QFileSelector> |
CMake | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake | QT += core |
继承 | QObject |
公共函数
QFileSelector(QObject *parent = nullptr) | |
virtual | ~QFileSelector() |
QStringList | allSelectors() const |
QStringList | extraSelectors() const |
QString | select(const QString &filePath) const |
QUrl | select(const QUrl &filePath) const |
void | setExtraSelectors(const QStringList &list) |
详细描述
QFileSelector 是一种通过平台或设备特性选择文件变体的便捷方式。在某些情况下,例如在部署步骤中无法确定正确的变体时,它允许您更容易地开发和部署包含所有不同变体的单一代码库。
使用 QFileSelector
如果您始终使用同一文件,那么不需要使用 QFileSelector。
考虑以下示例用法,其中您希望在不同的区域设置中使用不同的设置文件。您可以像这样在不同的区域设置之间选择代码:
QString defaultsBasePath = "data/"; QString defaultsPath = defaultsBasePath + "defaults.conf"; QString localizedPath = defaultsBasePath + QString("%1/defaults.conf").arg(QLocale().name()); if (QFile::exists(localizedPath)) defaultsPath = localizedPath; QFile defaults(defaultsPath);
同样,如果要根据目标平台选择不同的数据文件,您的代码可能看起来像这样
QString defaultsPath = "data/defaults.conf"; #if defined(Q_OS_ANDROID) defaultsPath = "data/android/defaults.conf"; #elif defined(Q_OS_IOS) defaultsPath = "data/ios/defaults.conf"; #endif QFile defaults(defaultsPath);
QFileSelector 提供了一种方便的替代方案来编写此类样板代码,在后者情况下,它允许您在不重新编译的情况下开始使用平台特定的配置。QFileSelector 还允许以方便的方式链式调用多个选择器,例如,仅在选择特定的平台和区域设置组合时选择不同的文件。例如,根据平台和/或区域设置进行选择的代码如下
QFileSelector selector; QFile defaultsFile(selector.select("data/defaults.conf"));
要将要选择的文件放置在以 '+'
和选择器名称命名的目录中。在上面的例子中,您可以将平台配置选择器放在以下位置
data/defaults.conf data/+android/defaults.conf data/+ios/+en_GB/defaults.conf
为了找到所选文件,QFileSelector 将查找与基本文件相同的目录。如果存在形式为 +<选择器> 的目录,并且有一个活动选择器,则 QFileSelector 将优先选择该目录中与基本文件具有相同文件名的文件。这些目录可以嵌套以检查多个选择器,例如
images/background.png images/+android/+en_GB/background.png
如果这些文件可用,您会选定一个不同的文件,但前提是地区设置为 en_GB。
如果没有有效的选择器,建议在基本文件位置有一个默认文件或错误处理文件,即使您预计所有部署都应有选择器。
在未来的版本中,一些可能被标记为部署时间静态文件,并在部署步骤中作为优化移动。由于选择器会带来性能成本,建议在涉及性能关键代码的情况下避免使用它们。
添加选择器
通常可用的选择器包括
- 平台,以下任一字符串与正在运行的平台匹配(列表不完整):android、ios、osx、darwin、mac、macos、linux、qnx、unix、windows。在Linux上,如果可以确定,还可以确定分发名称,如debian、fedora或opensuse。
- 地区,与QLocale().name()相同。
从 QT_FILE_SELECTORS
环境变量添加更多选择器,设置时应为逗号分隔的选择器集合。请注意,此变量只读取一次;如果在应用程序运行时变量更改,选择器可能不会更新。初始选择器集只在第一次使用时评估。
您还可以在运行时添加额外的选择器以实现自定义行为。这些将在任何未来对select()的调用中使用。如果额外的选择器列表已更改,对select()的调用将使用新的列表,并可能返回不同的结果。
当多个选择器适用时的冲突解决
当多个选择器可以应用于同一文件时,会选择第一个匹配的选择器。检查选择器的顺序如下
- 通过 setExtraSelectors() 设置的选择器,按照列表中的顺序排列
QT_FILE_SELECTORS
环境变量中的选择器,从左到右排序- 地区
- 平台
以下是一个同时匹配多个选择器的示例。它使用平台选择器,加上一个名为 "admin" 的额外选择器,该选择器由应用程序根据用户凭据设置。示例按顺序排列,以便在所有选择器都存在时选择匹配文件等级最低的文件
images/background.png images/+linux/background.png images/+windows/background.png images/+admin/background.png images/+admin/+linux/background.png
因为额外的选择器在平台之前被检查,所以当设置admin选择器时,在Windows上会选择 +admin/background.png
,而当admin选择器未设置时,在Windows上会选择 +windows/background.png
。在Linux上,当设置admin时,将选择 +admin/+linux/background.png
,而当未设置时,将选择 +linux/background.png
。
成员函数文档
[显式]
QFileSelector::QFileSelector(QObject *parent = nullptr)
创建一个 QFileSelector 实例。此实例将与其他 QFileSelector 实例具有相同的基本选择器,但将有自己的额外选择器集。
如果提供,将具有给定的 QObject parent。
[虚拟 noexcept]
QFileSelector::~QFileSelector()
销毁此选择器实例。
QStringList QFileSelector::allSelectors() const
返回此实例使用的完整、排序的选择器列表
QStringList QFileSelector::extraSelectors() const
返回已通过编程方式添加到此实例的额外选择器列表。
另见setExtraSelectors()。
QString QFileSelector::select(const QString &filePath) const
此函数根据运行时条件返回所选的路径版本。如果没有可选择的文件,则返回原始的filePath。
如果原始文件不存在,则返回原始的filePath。这意味着您必须有一个基础文件来备选,您不能只有一个可选子目录中的文件。
请参阅选择算法的类概述。
QUrl QFileSelector::select(const QUrl &filePath) const
这是对QUrl对象进行操作的select便捷版本的
若方案不是文件或qrc,则立即返回filePath。否则,将对filePath的路径应用选择,并返回一个包含所选路径以及其他与filePath相同的QUrl部分的QUrl。
请参阅选择算法的类概述。
void QFileSelector::setExtraSelectors(const QStringList &list)
设置已通过程序添加到该实例的额外选择器list。
这些选择器具有高于自动选取的任何选择器的优先级。
另请参阅extraSelectors()。
© 2024 The Qt Company Ltd. 包含在本文档中的文档贡献是各自所有者的版权。本文档提供的文档是根据GNU自由文档许可版本1.3的条款发放的,由自由软件基金会发布。Qt以及相应的标志是世界各地芬兰和/或其他国家的The Qt Company Ltd.的商标。所有其他商标均为其各自所有者的财产。