QFileSelector 类

QFileSelector 提供了一种方便的方式选择文件变体。 更多...

头文件 #include <QFileSelector>
CMakefind_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmakeQT += core
继承 QObject

公共函数

QFileSelector(QObject *parent = nullptr)
virtual~QFileSelector()
QStringListallSelectors() const
QStringListextraSelectors() const
QStringselect(const QString &filePath) const
QUrlselect(const QUrl &filePath) const
voidsetExtraSelectors(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()的调用将使用新的列表,并可能返回不同的结果。

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

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

  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

因为额外的选择器在平台之前被检查,所以当设置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.的商标。所有其他商标均为其各自所有者的财产。