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 创建,并提供给QDragQClipboard 对象。这是为了让 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 拖动的 widget,您最终要编写这样的代码:

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 = ...;
    
    QMimeData *mimeData = new QMimeData;
    mimeData->setData("text/csv", csvData);
  2. 我们可以子类化 QMimeData 并重新实现hasFormat(),formats() 和retrieveData().
  3. 如果拖放操作发生在单个应用程序中,我们可以子类化 QMimeData 并在其中添加额外数据,然后在接收器的拖放事件处理程序中使用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 XML 提供了QWindowsMimeConverter ,可将剪贴板格式映射为开放标准的 MIME 格式。同样,在 macOS 和 iOS 上,QUtiMimeConverter 将 MIME 映射为统一类型标识符。

另请参阅 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 ),则返回一种颜色;否则返回一个空变量。

使用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

如果对象可以返回图像,则返回存储QImageQVariant ;否则返回空变量。

使用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() )都会调用该函数。如果您想使用自定义数据结构(而不是QByteArraysetData() 提供的数据结构)来存储数据,可以重新实现它。这样,您还需要重新实现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() 宏将其注册为 Qt XMLmeta 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 模块。从QImageQVariant 的转换是隐式的。例如

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 XML 5.0 起,如果之前未调用setText ,setUrls 还会以纯文本形式导出 urls,以便将其放入任何 lineedit 和文本编辑器中。

另请参见 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()。

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