(1) 本源代码定义于头文件 qmimedata . h ,在剪贴板里,及网络上的涉及内容的剪贴与复制,用 MIME 类型来描述其中的数据内容以及各式。在本章的老师讲解的拖放事件里,用到了本类:
#ifndef QMIMEDATA_H
#define QMIMEDATA_H
#include <QtCore/qvariant.h>
#include <QtCore/qobject.h>
QT_BEGIN_NAMESPACE
class QUrl;
class QMimeDataPrivate;
/*
The QMimeData class provides a container for data that
records information about its MIME type.
Detailed Description :
QMimeData用于描述可以存储在剪贴板中并通过拖放机制传输的信息。
QMimeData对象将所承载的数据与相应的MIME类型相关联,
以确保信息能够在不同应用程序之间安全传输,并在同一应用程序内被正确复制。
QMimeData 对象通常使用 new创建并提供给 QDrag或 QClipboard 对象。
这是为了使 Qt能够管理它们使用的内存。
-个单一的QMimeData对象可同时使用多种不同的格式来存储相同的数据。
`formats()、函数返回一个按偏好顺序排列的可用格式的列表。
`data()、函数返回与MIME类型关联的原始数据,
而`setData()'允许您为MIME类型设置数据。
....................略,以后补充.
例如,如果你写一个接受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.自定义数据可以直接存储在QMimeData对象中,作为QByteArray使用setData()。例如:
QByteArray csvData = ...; //这就是 C 语言字符串
QMimeData * mimeData = new QMimeData;
mimeData->setData("text/csv", csvData);
2.我们可以子类化0MimeData并重实现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)
}
}
Platform-Specific MIME Types ;
在Windows上,`format()、方法还会返回MIME数据中可用的自定义格式,
使用`x-qt-windows-mime`子类型来表示它们代表非标准格式的数据。这些格式将采用以下形式:
application/x-qt-windows-mime;value="<custom type>"
The following are examples of custom MIME types:
application/x-qt-windows-mime;value="FileGroupDescriptor"
application/x-qt-windows-mime;value="FileContents"
每个格式的值声明描述了数据编码的方式。
在某些情况下(例如,删除多个电子邮件附件),可以提供多个数据值。可以通过添加索引值来访问这些值:
application/x-qt-windows-mime;value="FileContents";index=0
application/x-qt-windows-mime;value="FileContents";index=1
在Windows上,MIME格式并不总是直接映射到剪贴板格式。
Qt提供了QWinMime,用于将剪贴板格式映射到开放标准的MIME格式。
同样,QMacPasteboardMime将MIME映射到Mac变体。
*/
//MIME的全称是Multipurpose Internet Mail Extensions,也就是多用途互联网邮件扩展类型。
//MIME的类型汇总:text/plain、text/html、text/uri-list、application/x-color
class Q_CORE_EXPORT QMimeData : public QObject
{
Q_OBJECT
protected:
//Returns a variant with the given type containing data for the
// MIME type specified by mimeType.
//返回具有指定类型的变体,该变体包含由mimeType指定的MIME类型的数据。
//如果对象不支持指定的MIME类型或变体类型,则返回null变体。
//这个函数由通用数据()获取器以及
//便捷获取器(text()、html()、urs()、imageData()和colorData ()调用。
//如果您想使用自定义数据结构(而非setData ()提供的QByteArray)来存储数据,可以重写此函数。
//此外您还需要重写hasFormat()和formats()函数。
virtual QVariant retrieveData(const QString & mimetype, QMetaType preferredType) const;
private:
Q_DISABLE_COPY(QMimeData)
Q_DECLARE_PRIVATE(QMimeData)
public:
//Constructs a new MIME data object with no data in it.
QMimeData();
~QMimeData();
//Returns the data stored in the object in the format described by the
// MIME type specified by mimeType.
QByteArray data(const QString & mimetype) const;
void setData(const QString & mimetype, const QByteArray & data);
//Sets the data associated with the MIME type given by mimeType to the specified data.
//对于最常见的数据类型,
//您可以改为调用更高级别的函数setText()()和setColorData()、setHtml()、setUrls、setlmageData.
//注意,如果你想在项目视图拖放操作中使用自定义数据类型,
//你必须使用QDECLARE_METATYPE()宏将它注册为一个Qt元类型,并为它实现流操作符。
void clear(); //Removes all the MIME type and data entries in the object.
//如果对象可以返回指定的MIME类型的数据,则返回true,否则返回false。
//对于最常见的数据类型,
//你可以调用更高级的函数hasText()、hasHtml()、hasUrls()、haslmage()和hascolor()。
virtual
bool hasFormat (const QString & mimetype) const;
//返回该对象支持的格式列表。这是该对象能够返回合适数据的MIME类型列表,列表中的格式按优先级排序。
virtual
QStringList formats () const;
void removeFormat (const QString & mimetype);
//Removes the data entry for mimeType in the object.
//删除掉本 MIME数据里的 mimetype类型的数据访问途径。
//如果对象可以返回纯文本(MIME类型为text/plain),则返回true;否则返回false。
bool hasText () const;
QString text () const; //返回数据的纯文本(MIME类型为text/plain)表示。
void setText (const QString & text);
//Sets text as the plain text (MIME type text/plain) used to represent the data.
//如果对象可以返回HTML(MIME类型为text/html),则返回true;否则返回false。
bool hasHtml () const;
//如果对象中存储的数据是HTML(MIME类型为text/html),则返回一个字符串;否则返回空字符串。
QString html () const;
void setHtml (const QString & html);
//Sets html as the HTML (MIME type text/html) used to represent the data.
//如果对象可以返回一个URL列表,则返回true;否则返回false。URL对应于 MIME类型 text/uri-list。
bool hasUrls () const;
//URI:Uniform Resource Identifier,统一资源标识符。还有 URL定位,URN名字。
QList<QUrl> urls () const; //返回包含在MIME数据对象中的URL列表。
void setUrls (const QList<QUrl> & urls);
//将存储在MIME数据对象中的URL设置为由urs指定的URL。URL对应于MIME类型text/uri-list。
//自Qt5.0起,`setUrls`函数在之前未调用`setText'的情况下,也会将网址以纯文本形式导出,
// 从而使其能够被直接拖放到任何行编辑器和文本编辑器中。
//如果对象可以返回图像,则返回true;否则返回false。
bool hasImage () const;
//返回一个存储QImage的Variant,如果对象可以返回图像;否则返回空Variant。
//使用 QVariant是因为 QMimeData 属于 Qt core 模块,而 QImage属于 Qt GUI模块。
//要将 QVariant转换为 QImage,只需使用 qvariant_cast()即可。
//QImage image = qvariant_cast<QImage>(event->mimeData()->imageData());
QVariant imageData() const;
void setImageData(const QVariant & image);
//Sets the data in the object to the given image.
//举例:mimeData->setImageData( QImage("beautifulfjord.png") );
//如果对象可以返回颜色(MIME类型application/x-color),则返回true;否则返回false。
bool hasColor () const;
//如果对象中存储的数据表示一种颜色,则返回一个颜色;否则返回空QVariant。
//QColor color = qvariant_cast<QColor>( event->mimeData()->colorData() );
QVariant colorData() const;
void setColorData(const QVariant & color);
//Sets the color data in the object to the given color.
}; //class QMimeData : public QObject
QT_END_NAMESPACE
#endif // QMIMEDATA_H
(2)
谢谢