本页内容

QMimeDatabase Class

QMimeDatabase 类维护了一个 MIME 类型数据库。更多内容...

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

注意:该类中的所有函数均是线程安全的。

公共类型

enum MatchMode { MatchDefault, MatchExtension, MatchContent }

公共函数

QMimeDatabase()
~QMimeDatabase()
QList<QMimeType> allMimeTypes() const
QMimeType mimeTypeForData(QIODevice *device) const
QMimeType mimeTypeForData(const QByteArray &data) const
QMimeType mimeTypeForFile(const QFileInfo &fileInfo, QMimeDatabase::MatchMode mode = MatchDefault) const
QMimeType mimeTypeForFile(const QString &fileName, QMimeDatabase::MatchMode mode = MatchDefault) const
QMimeType mimeTypeForFileNameAndData(const QString &fileName, QIODevice *device) const
QMimeType mimeTypeForFileNameAndData(const QString &fileName, const QByteArray &data) const
QMimeType mimeTypeForName(const QString &nameOrAlias) const
QMimeType mimeTypeForUrl(const QUrl &url) const
QList<QMimeType> mimeTypesForFileName(const QString &fileName) const
QString suffixForFileName(const QString &fileName) const

详细说明

MIME 类型数据库由 freedesktop.org 的 shared-mime-info 项目提供。如果在系统上找不到 MIME 类型数据库(如大多数 Windows、macOS 和 iOS 系统的情况),Qt 将使用其自身的副本。

想要定义自定义 MIME 类型的应用程序需要将一个 XML 文件安装到搜索 MIME 定义的位置。可以通过以下方式查询这些位置

using namespace Qt::StringLiterals;
// ...
QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, "mime/packages"_L1,
                          QStandardPaths::LocateDirectory);

在典型的 Unix 系统中,该路径通常为 /usr/share/mime/packages/,但也可以通过设置环境变量 `XDG_DATA_DIRS` 来扩展目录列表。例如,将 `/opt/myapp/share` 添加到 `XDG_DATA_DIRS ` 中,系统就会在 `/opt/myapp/share/mime/packages/` 中搜索 MIME 定义。

以下是一个 MIME XML 的示例:

<?xml version="1.0" encoding="UTF-8"?>
<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
  <mime-type type="application/vnd.qt.qmakeprofile">
    <comment xml:lang="en">Qt qmake Profile</comment>
    <glob pattern="*.pro" weight="50"/>
  </mime-type>
</mime-info>

有关 XML MIME 定义语法的更多详细信息,包括如何定义“magic”以根据数据检测 MIME 类型,请参阅 http://standards 上的《共享 MIME 信息规范》。freedesktop.org/shared-mime-info-spec/shared-mime-info-spec-latest.html

在 Unix 系统上,为了提高性能,会使用二进制缓存。该缓存由命令“update-mime-database path”生成,其中 path 在上述示例中即为 /opt/myapp/share/mime。请确保在安装 MIME 类型定义文件时运行此命令。

QMimeDatabase db;
QMimeType mime = db.mimeTypeForFile(fileName);
if (mime.inherits("text/plain")) {
    // The file is plain text, we can display it in a QTextEdit
}

另请参阅 QMimeType 和MIME 类型浏览器。

成员类型文档

enum QMimeDatabase::MatchMode

此枚举指定了文件与 MIME 类型的匹配方式。

常量值描述
QMimeDatabase::MatchDefault0x0同时使用文件名和内容来查找匹配项
QMimeDatabase::MatchExtension0x1仅使用文件名进行匹配
QMimeDatabase::MatchContent0x2使用文件内容进行匹配

成员函数文档

QMimeDatabase::QMimeDatabase()

创建一个 QMimeDatabase 对象。

每次需要进行查询时,创建一个 QMimeDatabase 实例是完全可以的。MIME 类型的解析是在按需进行时(当安装了 shared-mime-info 时)或在构建第一个实例时(当直接解析 XML 文件时)完成的。

[noexcept] QMimeDatabase::~QMimeDatabase()

销毁QMimeDatabase 对象。

QList<QMimeType> QMimeDatabase::allMimeTypes() const

返回所有可用 MIME 类型的列表。

这在向用户显示所有 MIME 类型时可能很有用,例如在 MIME 类型编辑器中。但在其他情况下,除非确实必要,否则请勿使用;出于性能考虑,建议优先使用mimeTypeForXxx() 方法。

QMimeType QMimeDatabase::mimeTypeForData(QIODevice *device) const

返回device 中数据的 MIME 类型。

该方法始终返回一个有效的 MIME 类型。如果device 中的数据与任何已知的 MIME 类型都不匹配,则返回默认的 MIME 类型(application/octet-stream)。

QMimeType QMimeDatabase::mimeTypeForData(const QByteArray &data) const

返回data 的 MIME 类型。

始终返回一个有效的 MIME 类型。如果data 不匹配任何已知的 MIME 类型数据,则返回默认的 MIME 类型(application/octet-stream)。

QMimeType QMimeDatabase::mimeTypeForFile(const QFileInfo &fileInfo, QMimeDatabase::MatchMode mode = MatchDefault) const

返回fileInfo 的MIME类型。

始终返回一个有效的 MIME 类型。

默认的匹配算法会同时检查文件名和文件内容(如有必要)。文件扩展名优先于内容,但如果文件扩展名未知,或者与多个 MIME 类型匹配,则会使用内容进行判断。如果fileInfo 是 Unix 符号链接,则会使用它所引用的文件。 如果文件与任何已知模式或数据都不匹配,则返回默认 MIME 类型(application/octet-stream)。

当mode 设置为MatchExtension 时,仅使用文件名,而不使用文件内容。该文件甚至不必实际存在。如果文件名不匹配任何已知模式,则返回默认 MIME 类型(application/octet-stream)。 如果有多个 MIME 类型与该文件匹配,则返回按字母顺序排列的首个类型。

当mode 设置为MatchContent ,且文件可读时,仅使用文件内容来确定MIME类型。这相当于调用mimeTypeForData ,并将QFile 作为输入设备。

fileInfo 可能指绝对路径或相对路径。

另请参阅 QMimeType::isDefault() 和mimeTypeForData()。

QMimeType QMimeDatabase::mimeTypeForFile(const QString &fileName, QMimeDatabase::MatchMode mode = MatchDefault) const

使用mode 获取名为fileName 的文件的 MIME 类型。

这是一个重载函数。

QMimeType QMimeDatabase::mimeTypeForFileNameAndData(const QString &fileName, QIODevice *device) const

返回给定fileName 和device 数据的 MIME 类型。

当文件位于远程位置,且我们已在设备上开始下载其部分数据时,此重载版本会非常有用。这同样允许对远程文件进行完整的 MIME 类型匹配。

如果文件尚未打开,该函数会自动打开文件,并在 MIME 类型检测完成后关闭文件。

该函数始终返回一个有效的 MIME 类型。如果device 数据与任何已知的 MIME 类型数据都不匹配,则返回默认 MIME 类型(application/octet-stream)。

该方法会同时检查文件名和文件内容(如有必要)。文件扩展名优先于文件内容,但如果文件扩展名未知,或者与多个MIME类型匹配,则会使用文件内容进行判断。

QMimeType QMimeDatabase::mimeTypeForFileNameAndData(const QString &fileName, const QByteArray &data) const

返回给定fileName 和设备data 的MIME类型。

当文件位于远程位置,且我们已开始下载其部分数据时,此重载方法会非常有用。这使得我们也能对远程文件进行完整的 MIME 类型匹配。

该方法始终返回一个有效的 MIME 类型。如果data 不匹配任何已知的 MIME 类型数据,则返回默认 MIME 类型(application/octet-stream)。

该方法会同时检查文件名和文件内容(如有必要)。文件扩展名优先于文件内容,但如果文件扩展名未知,或者与多个 MIME 类型匹配,则会使用文件内容。

QMimeType QMimeDatabase::mimeTypeForName(const QString &nameOrAlias) const

返回nameOrAlias 的MIME类型;若未找到,则返回无效的MIME类型。

QMimeType QMimeDatabase::mimeTypeForUrl(const QUrl &url) const

返回url 的 MIME 类型。

如果 URL 指向本地文件,则会调用mimeTypeForFile 。

否则,仅根据文件名进行匹配,但文件名意义不大的协议(如 HTTP)除外。此方法始终为 HTTP URL 返回默认 MIME 类型,请使用QNetworkAccessManager 正确处理 HTTP URL。

该方法始终返回有效的 MIME 类型。如果url 未能匹配任何已知的 MIME 类型数据,则返回默认 MIME 类型(application/octet-stream)。

QList<QMimeType> QMimeDatabase::mimeTypesForFileName(const QString &fileName) const

返回文件名fileName 的 MIME 类型。

如果文件名与任何已知模式都不匹配,则返回一个空列表。如果有多个 MIME 类型与该文件匹配,则全部返回。

此函数不会尝试打开文件。若要在确定 MIME 类型时同时参考文件内容,请改用mimeTypeForFile() 或mimeTypeForFileNameAndData()。

另请参阅 mimeTypeForFile()。

QString QMimeDatabase::suffixForFileName(const QString &fileName) const

返回文件fileName 的后缀(根据 MIME 数据库中的记录)。

这样可以为 foo.tar.bz2 预选“tar.bz2”,但对于 my.file.with.dots.txt 仍仅预选“txt”。

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