QMimeData

QMimeData类提为数据提供一个容器,用来记录关于MIME类型数据的信息
QMimeData常用来描述保存在剪切板里信息,或者拖拽原理
QMimeData对象把它所保存的信息和正确的MIME类型连接起来来保证信息可以被安全的在应用程序之间转移,或者在同一个应用程序之间拷贝。QMimeData对象通常雇佣new来创建,并且支持QDrag和QClipboard对象,这可以使QT管理他们所使用的内存

单一的QMimeData对象可以同时用好几种不同的格式来存储同一个数据,formats()函数返回可以用的数据

格式的list,data()函数可以返回和MIME类型相连的数据类型,setData()用来为MIME类型设置数据

对于大多数MIME类型,QMimeData提供方便的函数来获取数据

例如,如果想让一个widget接受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、通常的数据可以象QByteArray()使用setData()直接存储在一个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)
     }

### 使用 Qt 中的 QMimeData 类 #### 子类化 QMimeData 并重写方法 为了更灵活地控制拖放操作中的数据交换,在特定情况下可以考虑继承 `QMimeData` 类,并覆盖其虚函数来满足需求。主要涉及的方法有: - **hasFormat(const QString &mimetype)**:判断是否存在指定 MIME 类型的数据[^1]。 ```cpp bool MyMimeData::hasFormat(const QString& format) const { if(format == "application/x-my-custom-type") return true; return QMimeData::hasFormat(format); } ``` - **formats()**:返回当前对象支持的所有 MIME 类型列表。 ```cpp QStringList MyMimeData::formats() const { QStringList list = QMimeData::formats(); list << "application/x-my-custom-type"; return list; } ``` - **retrieveData(const QString &mimetype, QVariant::Type preferredType)**:当请求某种类型的转换时调用此函数,用于提供实际的数据内容。 ```cpp QVariant MyMimeData::retrieveData(const QString& mimeType, QVariant::Type type) const { if(mimeType == "application/x-my-custom-type"){ QByteArray byteArray; // 填充byteArray... return byteArray; } return QMimeData::retrieveData(mimeType,type); } ``` 通过上述方式可以在不改变原有逻辑的基础上增加新的功能特性,比如传递额外的信息给目标组件以便更好地处理接收到的内容。 #### 实现跨控件间不同类型数据交互 对于不同目的端接受不同的自定义类型数据的情况,可以通过设置多种 MIME Type 来区分各个场景下的行为模式[^2]。例如点击 AAA 按钮触发拖拽动作的同时携带两种可能被识别的形式——selfMIMEType1 和 selfMIMEType2 ,分别对应于源部件内部以及外部窗口的目标区域所期望获取到的具体格式。 ```cpp void AAABtn::mousePressEvent(QMouseEvent* event){ ... MyMimeData *mimeData = new MyMimeData; mimeData->setData("application/x-self-mimetype1", serializeForBtn()); mimeData->setData("application/x-self-mimetype2", serializeForWidget()); QDrag *drag = new QDrag(this); drag->setMimeData(mimeData); if(drag->exec(Qt::CopyAction | Qt::MoveAction)==Qt::IgnoreAction){ delete mimeData; } } ``` 在接收方则依据实际情况选取合适的解析策略: ```cpp // 对应按钮自身的 drop 事件处理器 void AAABtn::dropEvent(QDropEvent *event){ const MyMimeData *data = qobject_cast<const MyMimeData*>(event->mimeData()); if(data && data->hasFormat("application/x-self-mimetype1")){ deserializeFromBtn(event->mimeData()->data("application/x-self-mimetype1")); event->acceptProposedAction(); } } // Widget 的 drop 事件处理器 void CustomWidget::dropEvent(QDropEvent *event){ const MyMimeData *data = qobject_cast<const MyMimeData*>(event->mimeData()); if(data && data->hasFormat("application/x-self-mimetype2")){ deserializeFromWidget(event->mimeData()->data("application/x-self-mimetype2")); event->acceptProposedAction(); } } ``` 这样就可以实现在同一应用内根据不同上下文环境动态调整拖放机制的行为表现了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值