QFileSelector Class

QFileSelector 提供了一种选择文件变量的便捷方法。更多

Header: #include <QFileSelector>
CMake.QFileSelector 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

有了这些可用文件,你就可以在安卓平台上选择不同的文件,但前提是本地语言是 en_GB。

为了在没有有效选择器的情况下进行错误处理,建议在基础文件位置设置默认文件或错误处理文件,即使你希望所有部署都有选择器。

在未来的版本中,有些选择器可能会被标记为部署时静态选择器,并在部署步骤中作为优化进行移动。由于选择器会带来性能代价,建议在涉及性能关键代码的情况下避免使用它们。

添加选择器

通常可用的选择器有

  • platform,与应用程序运行平台相匹配的以下任意字符串(列表并不详尽):ANDROID、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/background.png ;而在 Windows 上,当未设置管理员选择器时,将选择+windows/background.png 。在 Linux 上,如果设置了管理员选择器,则会选择+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 ,其他QUrl 部分与filePath 相同。

选择算法请参见类概述。

void QFileSelector::setExtraSelectors(const QStringList &list)

设置以编程方式添加到此实例的额外选择器的list

这些选择器的优先级高于任何自动添加的选择器。

另请参阅 extraSelectors()。

© 2025 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.