2024年12月3日 星期二

QMimeData 說明

一、MIME類型

MIME 訊息能包含文字、圖像、音訊、影片以及其他應用程式專用的資料。具體類型請見:MIME 參考手冊 。

二、描述

1、QMimeData類別是記錄有關其MIME類型的信息的資料提供容器。

2.QMimeData用來描述可以儲存在剪貼簿中並透過拖放機制傳輸的資訊。 QMimeData物件將它們所持有的資料與對應的MIME類型相關聯,以確保資訊可以在應用程式之間安全地傳輸,並在同一應用程式中進行複製。

3. QMimeData物件通常使用new創建,並提供給QDragQClipboard物件。這是為了使Qt能夠管理它們使用的記憶體。

4.一個QMimeData物件可以同時使用幾種不同的格式儲存相同的資料。format ()函數會依首選項順序傳回可用格式的清單。data ()函數傳回與MIME類型關聯的原始數據,setData () 為MIME類型設定資料。

例:一個接受URL拖曳的小部件的代碼:

  1. void MyWidget::dragEnterEvent(QDragEnterEvent *event)
  2. {
  3. if (event->mimeData()->hasUrls())
  4. event->acceptProposedAction();
  5. }
  6. void MyWidget::dropEvent(QDropEvent *event)
  7. {
  8. if (event->mimeData()->hasUrls()) {
  9. foreach (QUrl url, event->mimeData()->urls()) {
  10. ...
  11. }
  12. }
  13. }

三、三種可將自訂資料儲存在QMimeData物件中的方法

1、可以使用setData ()將自訂資料直接為QByteArray儲存在QMimeData物件中。 例如:

  1. QByteArray csvData = ...;
  2. QMimeData *mimeData = new QMimeData;
  3. mimeData->setData("text/csv", csvData);

2、將QMimeData子類化,然後重新實作hasFormat (),formats ()和retrieveData ()。

3.如果拖放操作發生在單一應用程式中,則我們可以將QMimeData子類化,並在其中添加額外的數據,並在接收者的drop事件處理程序中使用qobject_cast()。 例如:

  1. void MyWidget::dropEvent(QDropEvent *event)
  2. {
  3. const MyMimeData *myData =
  4. qobject_cast<const MyMimeData *>(event->mimeData());
  5. if (myData) {
  6. //直接访问myData的数据(不通过QMimeData的API)
  7. }
  8. }

四、特定平台的MIME類型

Windows系統,formats ()也會使用x-qt-windows-mime子類型傳回MIME資料中可用的自訂格式,以指示它們表示非標準格式的資料。 格式將採用以下形式:

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

例如:

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系统。

五、成员函数

1、QMimeData()

构造一个新的MIME数据对象,其中没有数据。

2、void clear()

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

3、QVariant colorData()

如果存储在对象中的数据表示一种颜色(MIME类型:application / x-color),则返回一种颜色;否则返回空的QVariant。要将QVariant转换为QColor,只需使用qvariant_cast()。 例:

  1. if (event->mimeData()->hasColor()) {
  2. QColor color = qvariant_cast<QColor>(event->mimeData()->colorData());
  3. ...
  4. }

4、QByteArray data(const QString &mimeType)

以参数指定的MIME类型描述的格式返回存储在对象中的数据。

5、QStringList formats()

返回对象支持的格式列表。 这是对象可以为其返回合适数据的MIME类型的列表。 列表中的格式按优先级顺序排列。对于最常见的数据类型,可以使用hasText()、hasHtml()、hasUrls()、hasImage()、hasColor()。

6、bool hasColor() const

是否可以返回颜色(application / x-color)类型。

7、[virtual] bool hasFormat(const QString &mimeType)

可以返回参数指定的MIME类型的数据。

8、bool hasHtml()

是否可以返回HTML(text / html)类型。

9、bool hasText()

是否可以返回文本(text / plain)类型。

10、bool hasUrls()

是否可以返回网址列表(text / uri-list)。

11、QString html()

如果存储在对象中的数据是HTML(text / html),则返回一个字符串。

12、QVariant imageData()

如果对象可以返回图像,则返回存储QImage的QVariant;否则,返回空的QVariant。要将QVariant转换为QImage,只需使用qvariant_cast()。 例如:

  1. if (event->mimeData()->hasImage()) {
  2. QImage image = qvariant_cast<QImage>(event->mimeData()->imageData());
  3. ...
  4. }

13、void removeFormat(const QString &mimeType)

删除对象中相应格式的数据条目。

14、QVariant retrieveData(const QString &mimeType, QVariant::Type type)

返回具有给定类型的QVariant,其中包含mimeType指定的MIME类型的数据。 如果对象不支持给定的MIME类型或变体类型,则返回空QVariant。通用data()获取器和便捷函数(text(),html(),urls(),imageData()和colorData())调用此函数。如果要使用自定义数据结构(而不是setData()提供的QByteArray)存储数据,则可以重新实现它。然后还需要重新实现hasFormat()和format()。

15、void setColorData(const QVariant &color)

将对象中的颜色数据设置为给定的颜色。颜色对应于MIME类型application / x-color

16、void setData(const QString &mimeType, const QByteArray &data)

將與mimeType給出的MIME類型關聯的資料設定為指定的資料。對於最常見的資料類型,可以呼叫更高層級的函數setText ()、setHtml ()、setUrls ()、setImageData ()、setColorData ()。如果要在專案檢視的拖曳作業中使用自訂資料類型,則必須使用Q_DECLARE_METATYPE ()巨集將其註冊為Qt元類型,並為其實作流運算子。然後必須使用qRegisterMetaTypeStreamOperators ()函數註冊流運算子

例,設定自訂資料類型為MIME類型:

  1. struct customData
  2. {
  3. customData() {}
  4. int one;
  5. bool two;
  6. QString three;
  7. operator QVariant() const
  8. {
  9. return QVariant::fromValue(*this);
  10. }
  11. friend QDataStream& operator<<(QDataStream& out, const customData& player);
  12. friend QDataStream& operator>>(QDataStream& in, customData& player);
  13. friend QDebug operator<<(QDebug dbg, const customData&);
  14. };
  15. inline QDataStream& operator<<(QDataStream& out, const customData& player)
  16. {
  17. out << player.one;
  18. out << player.two;
  19. out << player.three;
  20. return out;
  21. }
  22. inline QDataStream& operator>>(QDataStream& in, customData& player)
  23. {
  24. in >> player.one;
  25. in >> player.two;
  26. in >> player.three;
  27. return in;
  28. }
  29. QDebug operator<<(QDebug dbg, const customData & c)
  30. {
  31. dbg.nospace() << QStringLiteral("customData输出") << "{ one = " << c.one <<" two = "<< c.two << "three = " <<c.three <<"}";
  32. return dbg;
  33. }
  34. Q_DECLARE_METATYPE(customData);
  35. int main(int argc, char *argv[])
  36. {
  37. //注册类型
  38. qRegisterMetaTypeStreamOperators<customData>("customData");
  39. //设置自定义类型
  40. customData custData;
  41. custData.one = 100;
  42. custData.two = true;
  43. custData.three = "xxxx";
  44. QMimeData mimeData;
  45. QByteArray outBa;
  46. outBa.resize(sizeof(customData));
  47. QBuffer buffer(&outBa);
  48. buffer.open(QIODevice::WriteOnly);
  49. QDataStream out(&buffer);
  50. out << custData;
  51. buffer.close();
  52. mimeData.setData("application/customDate",outBa);
  53. //输出数据
  54. QByteArray inBa = mimeData.data("application/customDate");
  55. QBuffer buf(&inBa);
  56. buf.open(QIODevice::ReadOnly);
  57. QDataStream in(&buf);
  58. customData custData2;
  59. in>>custData2;
  60. qDebug()<< custData2;
  61. }

 17、void setHtml (const QString &html)

將內容設定為用於表示資料的HTML(MIME類型text / html)。

18、void setImageData (const QVariant & image )

將物件中的資料設定為給定的影像。從QImage到QVariant的轉換是隱式的。例:

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

19、void setText (const QString &text)

將文字設定為用於表示資料的純文字(MIME類型text/plain)。

20、void setUrls (const QList<QUrl> &urls)

將儲存在MIME資料物件中的URL設定為參數指定的URL。 (MIME類型的text / uri-list)。

21、QString text ()

傳回資料的純文字(MIME類型text/plain)表示形式。

22、QList<QUrl> urls ()

傳回MIME資料物件中包含的URL清單。

沒有留言:

張貼留言