本页内容

QResource Class

QResource 类提供了一个用于直接从资源中读取数据的接口。更多内容...

头文件: #include <QResource>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core

注意:该类中的所有函数均为可重入的。

公共类型

enum Compression { NoCompression, ZlibCompression, ZstdCompression }

公共函数

QResource(const QString &file = QString(), const QLocale &locale = QLocale())
~QResource()
QString absoluteFilePath() const
QResource::Compression compressionAlgorithm() const
const uchar *data() const
QString fileName() const
bool isValid() const
QDateTime lastModified() const
QLocale locale() const
void setFileName(const QString &file)
void setLocale(const QLocale &locale)
qint64 size() const
QByteArray uncompressedData() const
qint64 uncompressedSize() const

静态公共成员

bool registerResource(const QString &rccFileName, const QString &mapRoot = QString())
bool registerResource(const uchar *rccData, const QString &mapRoot = QString())
bool unregisterResource(const QString &rccFileName, const QString &mapRoot = QString())
bool unregisterResource(const uchar *rccData, const QString &mapRoot = QString())

受保护函数

QStringList children() const
bool isDir() const
bool isFile() const

详细说明

QResource 是一个对象,它表示与单个资源实体相关的一组数据(以及可能的子元素)。QResource 允许直接访问原始格式的字节。 通过这种直接访问方式,无需缓冲区复制或间接引用即可读取数据。当将资源实体视为文件进行交互时,间接引用通常非常有用,这可以通过 `QFile` 实现。QResource 背后的数据和子资源通常编译到应用程序/库中,但也可以在运行时加载资源。 在运行时加载时,资源文件将被作为一大块数据加载,然后通过资源树中的引用分段输出。

QResource 既可以通过绝对路径加载(将其视为以/ 字符为根的文件系统),也可以通过资源表示法(以: 字符为根)加载。还可以打开相对资源,该资源可在QDir::searchPaths() 返回的路径列表中找到。

表示文件的 QResource 背后会有数据支持,这些数据可能经过压缩,在这种情况下必须使用qUncompress() 来访问实际数据;若通过QFile 访问,则会隐式进行此操作。表示目录的 QResource 仅包含子项,而不包含数据。

动态资源加载

资源可以不包含在应用程序的二进制文件中,而是在运行时通过调用registerResource() 函数按需加载。传递给registerResource() 的资源文件必须是 rcc 生成的二进制资源。有关二进制资源的更多信息,请参阅《Qt 资源系统》文档。

当需要加载大量可能根据设置而变化,或可由用户编辑并随后重新创建的应用程序图标时,此方法通常非常有用。资源会立即加载到内存中,既可以通过单次文件读取操作实现,也可以作为内存映射文件加载。

由于仅需加载单个文件,且数据将通过setFileName() 中指定的路径分批提供,因此这种方法可显著提升性能。

unregisterResource() 函数会移除对特定文件的引用。如果当前有 QResource 对象引用了与该已注销文件相关的资源,这些引用仍将有效,但资源文件本身将从资源根目录中移除,因此无法再创建指向该资源数据的 QResource 对象。 当最后一个指向该资源的 QResource 被销毁时,该资源本身将从内存中解除映射。

数据损坏与安全性

QResource 类会对传入的文件进行一些检查,以确定当前版本的 Qt 是否支持该文件。 这些测试仅用于检查文件头是否请求了未编译的功能(例如 Zstandard 解压缩),或者文件是否属于未来版本的 Qt。它们并不确认整个文件的有效性。

对于来源不可信的文件,不应使用 QResource。应用程序的设计应确保仅尝试加载那些来源至少与应用程序本身或其插件一样可信的资源文件。

另请参阅 《Qt 资源系统》(QFile )、QDir 以及QFileInfo 。

成员类型文档

enum QResource::Compression

compressionAlgorithm() 函数使用此枚举来指示 RCC 工具用于压缩有效载荷的算法。

常量值描述
QResource::NoCompression0内容未压缩
QResource::ZlibCompression1内容使用zlib进行压缩,可使用qUncompress() 函数进行解压。
QResource::ZstdCompression2内容使用zstd 进行压缩。要解压,请使用 zstd 库中的ZSTD_decompress () 函数。

另请参阅 compressionAlgorithm()。

成员函数文档

QResource::QResource(const QString &file = QString(), const QLocale &locale = QLocale())

创建一个指向file 的 QResource。locale 用于加载资源数据的特定本地化版本。

另请参阅 QFileInfo 、QDir::searchPaths()、setFileName() 以及setLocale()。

[noexcept] QResource::~QResource()

释放QResource 对象占用的资源。

QString QResource::absoluteFilePath() const

返回该QResource 所表示的实际路径;如果该资源是通过QDir::searchPaths() 找到的,则路径中会予以标注。

另请参阅 fileName()。

[protected] QStringList QResource::children() const

返回该目录下所有资源的列表;如果资源表示一个文件,则该列表为空。

另请参阅 isDir()。

QResource::Compression QResource::compressionAlgorithm() const

返回该资源所使用的压缩类型(如有)。如果未进行压缩,则该函数返回QResource::NoCompression 。

如果该函数返回QResource::ZlibCompression ,您可以使用qUncompress()函数对数据进行解压。在Qt 5.13之前,这是唯一可用的压缩算法。

如果该函数返回QResource::ZstdCompression ,则需要使用 Zstandard 库函数(<zstd.h> 头文件)。Qt 不提供封装函数。

请参阅Zstandard 手册。

另请参阅 data() 和isFile()。

const uchar *QResource::data() const

返回对该资源所代表的只读数据段的直接访问权限。如果该资源经过压缩,则返回的数据也是压缩的。调用方必须对数据进行解压,或者使用uncompressedData()。如果该资源是一个目录,则返回nullptr 。

另请参阅 uncompressedData()、size() 和isFile()。

QString QResource::fileName() const

返回该QResource 所表示的文件的完整路径(即传入时的路径)。

另请参阅 setFileName() 和absoluteFilePath()。

[protected] bool QResource::isDir() const

如果该资源表示一个目录(因此可能包含 `children()`),则返回 `true `;如果表示一个文件,则返回 `false`。

另请参阅 isFile()。

[protected] bool QResource::isFile() const

如果资源表示一个文件且因此有数据支持,则返回 `true `;如果表示一个目录,则返回 `false`。

另请参阅 isDir()。

bool QResource::isValid() const

如果该资源确实存在于资源层次结构中,则返回true ;否则返回false。

QDateTime QResource::lastModified() const

返回文件在打包为资源之前最后一次被修改的日期和时间。

QLocale QResource::locale() const

返回用于查找QResource 相关数据的区域设置。

另请参阅 setLocale()。

[static] bool QResource::registerResource(const QString &rccFileName, const QString &mapRoot = QString())

将资源注册到指定的rccFileName 中,位置由mapRoot 指定;如果文件成功打开,则返回true ;否则返回false 。

另请参阅 unregisterResource()。

[static] bool QResource::registerResource(const uchar *rccData, const QString &mapRoot = QString())

将资源注册到指定的rccData 中,位置为资源树中由mapRoot 指定的位置,如果文件成功打开,则返回true ;否则返回false 。

警告: 在任何可能引用该资源数据的QFile 的整个生命周期内,数据 必须保持有效。

另请参阅 unregisterResource()。

void QResource::setFileName(const QString &file)

将QResource 设置为指向file 。file 可以是绝对路径,此时文件将直接打开;若是相对路径,则会尝试通过QDir::searchPaths()查找该文件。

另请参阅 fileName() 和absoluteFilePath()。

void QResource::setLocale(const QLocale &locale)

将QResource 设置为仅加载locale 对应资源的本地化版本。如果未找到特定语言环境的资源,则使用C语言环境。

另请参阅 locale() 和setFileName()。

qint64 QResource::size() const

返回资源所对应存储数据的大小。

如果资源经过压缩,则此函数返回压缩后数据的大小。有关未压缩数据的大小,请参阅uncompressedSize()。

另请参阅 data()、uncompressedSize() 和isFile()。

QByteArray QResource::uncompressedData() const

如果资源数据以压缩形式存储,则先对其进行解压缩,然后返回资源数据。如果资源是一个目录,或者在解压缩过程中发生错误,则返回空的QByteArray 。

注意:如果 数据经过压缩,每次调用此函数时都会进行解压。调用之间的结果不会被缓存。

另请参阅 uncompressedSize()、size()、compressionAlgorithm() 和isFile()。

qint64 QResource::uncompressedSize() const

返回此资源中数据的大小。如果数据未经过压缩,则该函数的返回结果与size()相同;如果数据经过压缩,则该函数会从存储的流中提取原始未压缩数据的大小。

另请参阅 size()、uncompressedData() 和isFile()。

[static] bool QResource::unregisterResource(const QString &rccFileName, const QString &mapRoot = QString())

取消在资源树中由mapRoot 指定的位置处,针对给定rccFileName 的资源的注册;如果资源成功卸载且不存在对该资源的引用,则返回true ;否则返回false 。

另请参阅 registerResource()。

[static] bool QResource::unregisterResource(const uchar *rccData, const QString &mapRoot = QString())

取消在资源树中由mapRoot 指定的位置对指定rccData 的资源的注册,如果资源已成功卸载且不存在对该资源的引用,则返回true ;否则返回false 。

另请参阅 registerResource()。

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