本页内容

QFileSelector Class

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 会在基文件所在的同一目录中查找选定的文件。 如果存在形式为 +<selector> 且具有活动选择器的目录,QFileSelector 将优先选择该目录中与基础文件同名的文件,而非基础文件本身。这些目录可以嵌套,以便针对多个选择器进行检查,例如:

images/background.png
images/+android/+en_GB/background.png

在这些文件可用时,您会在 Android 平台上选择不同的文件,但仅当区域设置为 en_GB 时才如此。

对于无有效选择器的情况,建议在基文件位置放置一个默认文件或错误处理文件,即使您预期所有部署中都会存在选择器。

在未来的版本中,部分选择器可能会被标记为“部署时静态”,并在部署步骤中进行移动以实现优化。由于选择器会带来性能开销,因此建议在涉及性能关键型代码的情况下避免使用它们。

添加选择器

通常可用的选择器包括

  • platform,即与应用程序运行平台匹配的以下任一字符串(列表不完整):android、harmonyos、ios、osx、darwin、mac、macos、linux、qnx、unix、windows。 在 Linux 系统上,如果能确定,还会包含发行版的名称,例如 debian、fedora 或 opensuse。
  • locale,与 QLocale().name() 相同。

还将从QT_FILE_SELECTORS 环境变量中添加更多选择器,该变量设置时应为一组以逗号分隔的选择器。请注意,该变量仅会被读取一次;如果在应用程序运行期间变量发生变化,选择器可能不会更新。初始选择器集仅在首次使用时评估一次。

您还可以在运行时添加额外的选择器以实现自定义行为。这些选择器将用于后续对select() 的任何调用。如果额外的选择器列表已发生变化,对select() 的调用将使用新列表,且返回结果可能会有所不同。

多个选择器适用时的冲突解决

当多个选择器均可应用于同一文件时,将选择第一个匹配的选择器。选择器的检查顺序如下:

  1. 通过setExtraSelectors() 设置的选择器,按列表中的顺序
  2. QT_FILE_SELECTORS 环境变量中的选择器,从左到右
  3. 区域设置
  4. 平台

以下是一个涉及多个选择器同时匹配的示例。该示例使用了平台选择器,此外应用程序还会根据用户凭据设置一个名为“admin”的额外选择器。该示例按特定顺序排列,以便在所有选择器均存在时,系统会选择匹配条件最宽松的文件:

images/background.png
images/+linux/background.png
images/+windows/background.png
images/+admin/background.png
images/+admin/+linux/background.png

由于额外选择器会在平台选择器之前进行检查,因此在 Windows 系统中,当设置了“admin”选择器时将选择+admin/background.png ;而当未设置“admin”选择器时,则选择+windows/background.png 。在 Linux 系统中,当设置了“admin”选择器时将选择+admin/+linux/background.png ;当未设置时,则选择+linux/background.png 。

成员函数文档

[explicit] QFileSelector::QFileSelector(QObject *parent = nullptr)

创建一个 QFileSelector 实例。该实例将拥有与其他 QFileSelector 实例相同的静态选择器,但还会拥有自己的一组额外选择器。

如果提供了该参数,它将具有给定的QObject parent 。

[virtual 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操作的便捷版本。如果方案不是file或qrc,则立即返回filePath 。否则,将对filePath 的路径应用选择操作,并返回一个QUrl ,其中包含所选路径以及与filePath 相同的其他QUrl 部分。

有关选择算法的详细信息,请参阅类概述。

void QFileSelector::setExtraSelectors(const QStringList &list)

设置通过编程方式添加到该实例中的额外选择器的list 。

这些选择器的优先级高于任何被自动捕获的选择器。

另请参阅 extraSelectors()。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.