本页内容

QMimeData Class

QMimeData 类提供了一个数据容器,用于记录有关其 MIME 类型的信息。更多内容...

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

公共函数

QMimeData()
virtual ~QMimeData()
void clear()
QVariant colorData() const
QByteArray data(const QString &mimeType) const
virtual QStringList formats() const
bool hasColor() const
virtual bool hasFormat(const QString &mimeType) const
bool hasHtml() const
bool hasImage() const
bool hasText() const
bool hasUrls() const
QString html() const
QVariant imageData() const
void removeFormat(const QString &mimeType)
void setColorData(const QVariant &color)
void setData(const QString &mimeType, const QByteArray &data)
void setHtml(const QString &html)
void setImageData(const QVariant &image)
void setText(const QString &text)
void setUrls(const QList<QUrl> &urls)
QString text() const
QList<QUrl> urls() const

受保护函数

virtual QVariant retrieveData(const QString &mimeType, QMetaType type) const

详细说明

QMimeData 用于描述可存储在 `clipboard` 中,并通过拖放机制传输的信息。QMimeData 对象将其所包含的数据与相应的 MIME 类型相关联,以确保信息能够在应用程序之间安全传输,并在同一应用程序内进行复制。

QMimeData 对象通常通过 `new ` 创建,并传递给 `QDrag ` 或 `QClipboard ` 对象。这样可以使 Qt 管理它们所使用的内存。

一个 QMimeData 对象可以同时以多种不同格式存储同一组数据。formats() 函数按优先级顺序返回可用格式的列表。data() 函数返回与 MIME 类型关联的原始数据,而setData() 函数允许您为 MIME 类型设置数据。

对于最常见的 MIME 类型,QMimeData 提供了便捷函数来访问数据:

测试者获取器设置器MIME 类型
hasText()text()setText()text/plain
hasHtml()html()setHtml()text/html
hasUrls()urls()setUrls()text/uri-list
hasImage()imageData()setImageData()image/ *
hasColor()colorData()setColorData()application/x-color

例如,如果你编写一个支持 URL 拖放的小部件,最终会写出类似这样的代码:

void MyWidget::dragEnterEvent(QDragEnterEvent *event)
{
    if (event->mimeData()->hasUrls())
        event->acceptProposedAction();
}

void MyWidget::dropEvent(QDropEvent *event)
{
    if (event->mimeData()->hasUrls()) {
        foreach (QUrl url, event->mimeData()->urls()) {
            //...
        }
    }
}

在 QMimeData 对象中存储自定义数据有三种方法:

  1. 可以通过setData()将自定义数据作为QByteArray 直接存储在QMimeData对象中。例如:
    QByteArray csvData = something;
    
    QMimeData *mimeData = new QMimeData;
    mimeData->setData("text/csv", csvData);
  2. 我们可以继承 QMimeData 并重写hasFormat()、formats() 和retrieveData() 方法。
  3. 如果拖放操作发生在单个应用程序内部,我们可以继承 QMimeData 并在其中添加额外数据,并在接收方的 drop 事件处理程序中使用qobject_cast()。例如:
    void MyWidget::dropEvent(QDropEvent *event)
    {
        const MyMimeData *myData =
                qobject_cast<const MyMimeData *>(event->mimeData());
        if (myData) {
            // access myData's data directly (not through QMimeData's API)
        }
    }

特定于平台的 MIME 类型

在 Windows 上,formats() 还会返回 MIME 数据中可用的自定义格式,并使用子类型x-qt-windows-mime 来指示这些格式代表非标准格式的数据。这些格式的形式如下:

application/x-qt-windows-mime;value="<custom type>"

以下是自定义 MIME 类型的示例:

application/x-qt-windows-mime;value="FileGroupDescriptor"
application/x-qt-windows-mime;value="FileContents"

每种格式的value 声明描述了数据的编码方式。

在某些情况下(例如拖放多个电子邮件附件),会有多个数据值可用。可以通过添加一个index 值来访问这些数据:

application/x-qt-windows-mime;value="FileContents";index=0
application/x-qt-windows-mime;value="FileContents";index=1

在 Windows 系统上,MIME 格式并不总是与剪贴板格式直接对应。Qt 提供了 `QWindowsMimeConverter ` 来将剪贴板格式映射到开放标准的 MIME 格式。同样,在 macOS 和 iOS 系统上,`QUtiMimeConverter ` 将 MIME 映射到统一类型标识符(UTI)。

另请参阅 QClipboard 、QDragEnterEvent 、QDragMoveEvent 、QDropEvent 、QDrag 以及“拖放”。

成员函数文档

QMimeData::QMimeData()

创建一个不包含任何数据的新 MIME 数据对象。

[virtual noexcept] QMimeData::~QMimeData()

销毁 MIME 数据对象。

void QMimeData::clear()

删除对象中的所有 MIME 类型和数据条目。

QVariant QMimeData::colorData() const

如果对象中存储的数据表示一种颜色(MIME 类型为application/x-color ),则返回该颜色;否则返回一个 null 变体。

这里使用QVariant 是因为QMimeData 属于Qt Core 模块,而QColor 属于Qt GUI 。要将QVariant 转换为QColor ,只需使用qvariant_cast() 即可。例如:

if (event->mimeData()->hasColor()) {
    QColor color = qvariant_cast<QColor>(event->mimeData()->colorData());
    //...
}

另请参阅 hasColor()、setColorData() 和data()。

QByteArray QMimeData::data(const QString &mimeType) const

以由mimeType 指定的 MIME 类型所描述的格式,返回该对象中存储的数据。如果该对象不包含mimeType MIME 类型的数据(参见hasFormat()),则本函数可能会尽最大努力将其转换为该格式。

另请参阅 hasFormat() 和setData()。

[virtual] QStringList QMimeData::formats() const

返回该对象支持的格式列表。该列表包含该对象能够返回相应数据的 MIME 类型。列表中的格式按优先级排序。

对于最常见的数据类型,您可以改用更高级的函数:hasText()、hasHtml()、hasUrls()、hasImage() 和hasColor()。

另请参阅 hasFormat()、setData()、data() 和 ()。

bool QMimeData::hasColor() const

如果对象可以返回颜色(MIME 类型为application/x-color ),则返回true ;否则返回false 。

另请参阅 setColorData()、colorData() 和hasFormat()。

[virtual] bool QMimeData::hasFormat(const QString &mimeType) const

如果对象能够返回由mimeType 指定的 MIME 类型的数据,则返回true ;否则返回false 。

对于最常见的数据类型,您可以改用更高层次的函数hasText()、hasHtml()、hasUrls()、hasImage() 和hasColor() 来调用。

另请参阅 formats()、setData()、data() 和 ()。

bool QMimeData::hasHtml() const

如果对象可以返回 HTML(MIME 类型为text/html ),则返回true ;否则返回false 。

另请参阅 setHtml()、html() 和hasFormat()。

bool QMimeData::hasImage() const

如果对象能够返回图像,则返回true ;否则返回 false。

另请参阅 setImageData()、imageData() 和hasFormat()。

bool QMimeData::hasText() const

如果对象可以返回纯文本(MIME 类型为text/plain ),则返回true ;否则返回false 。

另请参阅 setText()、text()、hasHtml() 和hasFormat()。

bool QMimeData::hasUrls() const

如果对象可以返回一个 URL 列表,则返回true ;否则返回false 。

这些 URL 对应于 MIME 类型text/uri-list 。

另请参阅 setUrls()、urls(),以及hasFormat()。

QString QMimeData::html() const

如果对象中存储的数据是 HTML(MIME 类型为text/html ),则返回一个字符串;否则返回一个空字符串。

另请参阅 setHtml()、hasHtml() 和setData()。

QVariant QMimeData::imageData() const

如果对象可以返回图像,则返回一个存储QImage 的QVariant ;否则返回一个空变体。

之所以使用QVariant ,是因为QMimeData 属于Qt Core 模块,而QImage 属于Qt GUI 模块。要将QVariant 转换为QImage ,只需使用qvariant_cast()即可。例如:

if (event->mimeData()->hasImage()) {
    QImage image = qvariant_cast<QImage>(event->mimeData()->imageData());
    //...
}

另请参阅 setImageData() 和hasImage()。

void QMimeData::removeFormat(const QString &mimeType)

删除对象中mimeType 的数据条目。

[virtual protected] QVariant QMimeData::retrieveData(const QString &mimeType, QMetaType type) const

返回一个包含给定type 的变体,该 包含由mimeType 指定的MIME类型的数据。如果对象不支持给定的MIME类型或变体类型,则返回一个空变体。

此函数由通用data()获取器以及便捷获取器(text()、html()、urls()、imageData()和colorData())调用。如果您希望使用自定义数据结构(而非由setData()提供的QByteArray )来存储数据,可以重写此函数。 届时,您还需要重写hasFormat() 和formats()。

另请参阅 data()。

void QMimeData::setColorData(const QVariant &color)

将对象中的颜色数据设置为给定的color 。

颜色对应于 MIME 类型application/x-color 。

另请参阅 colorData()、hasColor() 和setData()。

void QMimeData::setData(const QString &mimeType, const QByteArray &data)

将与mimeType 指定的MIME类型相关的数据设置为指定的data 。

对于最常见的数据类型,您可以改用更高层次的函数setText()、setHtml()、setUrls()、setImageData() 和setColorData()。

请注意,若要在项目视图的拖放操作中使用自定义数据类型,必须使用Q_DECLARE_METATYPE() 宏将其注册为 Qtmeta type ,并为其实现流运算符。

另请参阅 data()、hasFormat()、QMetaType 以及Q_DECLARE_METATYPE()。

void QMimeData::setHtml(const QString &html)

将html 设置为用于表示该数据的 HTML(MIME 类型text/html )。

另请参阅 html()、hasHtml()、setText() 和setData()。

void QMimeData::setImageData(const QVariant &image)

将对象中的数据设置为给定的image 。

之所以使用QVariant ,是因为QMimeData 属于Qt Core 模块,而QImage 属于Qt GUI 模块。从QImage 到QVariant 的转换是隐式的。例如:

mimeData->setImageData(QImage("beautifulfjord.png"));

另请参阅 imageData()、hasImage() 和setData()。

void QMimeData::setText(const QString &text)

将text 设置为用于表示该数据的纯文本(MIME 类型为text/plain )。

另请参阅 text()、hasText()、setHtml() 以及setData()。

void QMimeData::setUrls(const QList<QUrl> &urls)

将存储在 MIME 数据对象中的 URL 设置为urls 中指定的 URL。

这些 URL 对应于 MIME 类型text/uri-list 。

从 Qt 5.0 开始,如果之前未调用setText ,setUrls 还会将 URL 作为纯文本导出,以便将其拖放到任何行编辑框和文本编辑器中。

另请参阅 urls()、hasUrls() 以及setData()。

QString QMimeData::text() const

如果该对象包含纯文本,则返回该数据的纯文本(MIME 类型为text/plain )表示形式。如果包含其他内容,该函数将尽最大努力将其转换为纯文本。

另请参阅 setText()、hasText()、html(),以及data()。

QList<QUrl> QMimeData::urls() const

返回 MIME 数据对象中包含的 URL 列表。

这些 URL 对应于 MIME 类型text/uri-list 。

另请参阅 setUrls()、hasUrls() 和data()。

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