QT6源,六章(9):QMimeData 源码附注释,及 MIME类型汇总:text/plain、text/html、text/uri-list、image/*、application/x-color

(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)

谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangzhangkeji

谢谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值