当前位置: 首页 > news >正文

Qt|实现将QTreeWidget类item对象鼠标左键拖拽效果到QWidget接收

文章目录

  • 需求
  • 思路
  • 效果
  • 实现
    • 发送QTreeWidget类
    • 接收QWidget类
      • MIME类型
      • 自定义MIME类型

需求

实现一个继承QTreeWidget类item对象鼠标左键拖拽效果到QWidget接收信息,实现绑定效果。

思路

使用Qt自带的拖拽函数来进行实现。

效果

图片

实现

发送QTreeWidget类

头文件,主要需要继承startDrag函数

protected:void startDrag(Qt::DropActions supportedActions) override;

源文件

void QTreeWidget::startDrag(Qt::DropActions supportedActions)
{// 创建拖拽事件QTreeWidgetItem *item = currentItem();QMimeData *mimeData = new QMimeData;// 这里需要根据你的item数据来设置mimeData,例如:mimeData->setText(item->text(0));// 创建QDrag对象QDrag *drag = new QDrag(this);drag->setMimeData(mimeData);// 可以设置拖拽时的光标图标QRect itemRect = visualItemRect(item); // 获取项的矩形区域QPixmap itemPixmap = QPixmap::grabWidget(this, itemRect); // 获取项的屏幕截图// 调整拖拽光标的热点,使其位于截图的中心drag->setPixmap(itemPixmap);// 执行拖拽操作Qt::DropAction dropAction = drag->exec(supportedActions, Qt::MoveAction);/*if (dropAction == Qt::MoveAction) {// 处理拖拽结束的逻辑,例如从界面上移除拖拽的项for (QTreeWidgetItem *item : items) {this->takeTopLevelItem(this->indexOfTopLevelItem(item));}}*/
}

接收QWidget类

头文件,主要继承dragEnterEvent、dragMoveEvent、dropEvent三个函数

public slots:void dragEnterEvent(QDragEnterEvent* event);void dragMoveEvent(QDragMoveEvent* event);void dropEvent(QDropEvent* event);

源文件

void SingleDisplayView::dragEnterEvent(QDragEnterEvent* event)
{const QMimeData* mimeData = event->mimeData();// 检查拖拽的数据类型,确定是否接受拖拽if (event->mimeData()->hasFormat("text/plain")) {event->acceptProposedAction();QApplication::setOverrideCursor(Qt::PointingHandCursor); // 设置鼠标为可添加状态}else {event->ignore();QApplication::setOverrideCursor(Qt::ForbiddenCursor); // 设置鼠标为不可添加状态}
}
void SingleDisplayView::dragMoveEvent(QDragMoveEvent* event) 
{  // 可以在这里更新鼠标的位置,根据位置判断是否可以放置// ...//dragEnterEvent(event); // 可以使用相同的逻辑//event->accept(); 
}
void SingleDisplayView::dropEvent(QDropEvent* event)
{// 处理放置动作,更新UI或数据if (event->mimeData()->hasFormat("text/plain")) {// 获取拖拽的数据QString name = event->mimeData()->text();// 接受拖拽事件event->setDropAction(Qt::MoveAction);event->accept();}else {// 如果数据格式不正确,不接受拖拽事件event->ignore();}// 恢复鼠标光标QApplication::restoreOverrideCursor();
}

MIME类型

在Qt中,除了 "text/uri-list",还有许多其他的MIME类型可以用来在拖拽操作中传递数据。MIME类型是一种标准,用于定义数据的类型和格式。以下是一些常见的MIME类型:

  1. “text/plain”:表示纯文本数据。
  2. “application/json”:表示JSON格式的数据。
  3. “application/octet-stream”:表示任意的二进制数据流。
  4. “image/png”:表示PNG格式的图像数据。
  5. “image/jpeg”:表示JPEG格式的图像数据。

如果你只需要传递一个 QString,你可以使用 "text/plain" MIME类型。以下是如何在拖拽操作中设置和检查 "text/plain" MIME类型的示例:

设置 “text/plain” MIME类型:

QMimeData *mimeData = new QMimeData;
mimeData->setText(yourQString); // 这里的yourQString是你想要拖拽的QString数据
QDrag *drag = new QDrag(this);
drag->setMimeData(mimeData);
// ... 其他拖拽设置

检查 “text/plain” MIME类型:

void SingleDisplayView::dragEnterEvent(QDragEnterEvent *event)
{const QMimeData *mimeData = event->mimeData();// 检查是否包含"text/plain"格式的数据if (mimeData->hasFormat("text/plain")) {event->acceptProposedAction();QApplication::setOverrideCursor(Qt::PointingHandCursor); // 设置鼠标为可添加状态} else {event->ignore();QApplication::setOverrideCursor(Qt::ForbiddenCursor); // 设置鼠标为不可添加状态}// event->accept();
}

在上面的示例中,我们在 QMimeData 对象中设置了 QString 数据,并使用 "text/plain" 作为MIME类型。在 dragEnterEvent 方法中,我们检查了拖拽事件的 QMimeData 是否包含 "text/plain" 格式的数据。

使用 "text/plain" 是传递文本数据的通用方式,它在很多情况下都很有用,尤其是在需要简单文本传输时。然而,如果你需要传递更复杂的数据结构,可能需要自定义MIME类型,并在拖拽源和目标之间约定好数据的格式和解析方式。

自定义MIME类型

在Qt中,自定义MIME类型允许你定义自己的数据格式,以便在拖拽操作(drag and drop)和其他需要数据传输的场景中使用。以下是如何自定义MIME类型并使用它的步骤:

  1. 定义自定义MIME类型:选择一个独特的字符串作为你的MIME类型。通常,自定义MIME类型建议使用反域名(reverse domain name)格式来避免与现有MIME类型冲突,例如:"x-vendor/app-specific-data"

  2. 设置自定义MIME类型数据:在QMimeData对象中使用setData方法设置你的自定义数据。

  3. 检查自定义MIME类型:在dragEnterEventdropEvent中使用hasFormat方法检查拖拽的QMimeData是否包含你的自定义MIME类型。

  4. 获取自定义MIME类型数据:如果QMimeData包含你的自定义MIME类型,使用data方法来获取数据。

以下是一个自定义MIME类型的示例:

定义和设置自定义MIME类型:

// 创建QMimeData对象
QMimeData *mimeData = new QMimeData;// 定义自定义MIME类型
const QString customMimeType = "x-vendor/app-specific-data";// 假设你要传输的数据是一个JSON字符串
QString jsonData = "{\"key1\":\"value1\", \"key2\": 42}";// 在QMimeData中设置自定义MIME类型数据
mimeData->setData(customMimeType, QByteArray::fromStdString(jsonData.toStdString()));

检查和获取自定义MIME类型数据:

void MyWidget::dragEnterEvent(QDragEnterEvent *event)
{// 检查拖拽事件是否包含自定义MIME类型if (event->mimeData()->hasFormat("x-vendor/app-specific-data")) {// 接受拖拽动作event->acceptProposedAction();} else {// 拒绝拖拽动作event->ignore();}
}void MyWidget::dropEvent(QDropEvent *event)
{// 获取自定义MIME类型的数据const QMimeData *mimeData = event->mimeData();if (mimeData->hasFormat("x-vendor/app-specific-data")) {QByteArray jsonData = mimeData->data("x-vendor/app-specific-data");QString jsonString = QString::fromStdString(jsonData.toStdString());// 处理jsonData,例如解析JSON// ...// 接受放置动作event->accept();} else {// 拒绝放置动作event->ignore();}
}

在这个示例中,我们首先定义了一个自定义MIME类型"x-vendor/app-specific-data",并通过setData方法将JSON格式的字符串数据与这个MIME类型关联起来。在dragEnterEventdropEvent中,我们检查QMimeData是否包含这个自定义MIME类型,并据此决定是否接受拖拽或放置动作。如果接受,我们使用data方法来获取之前设置的数据。

自定义MIME类型非常有用,特别是当你需要在应用程序中传输特定格式的数据,而这些数据没有现成的MIME类型可用时。通过使用自定义MIME类型,你可以确保数据的传输是明确和安全的。

http://www.xdnf.cn/news/759673.html

相关文章:

  • PCIe Gen6相比Gen5的新特性、优化点
  • c++之数组
  • latex 三线表-算法对比表
  • 理解解释器架构:原理、组成与运行机制全解析
  • leetcode hot100 二叉树(一)
  • c++之分支
  • SOC-ESP32S3部分:24-WiFi配网
  • 【PyQt5】从零开始的PyQt5 - QLabel篇
  • 18. Qt系统相关:多线程
  • Matlab作图之 subplot
  • 抖音客户端训练营--day2
  • 一:UML类图
  • JMeter 直连数据库
  • 1Remote远程会话管理以及一键启动虚拟机
  • Spring 中 @Value 注解多实例配置方案详解
  • 看问题的本质背后是什么?
  • pycharm打印时不换行,方便对比观察
  • Vue3.5 企业级管理系统实战(二十一):菜单权限
  • 前端面经 两栏布局
  • 远程管理SSH服务的搭建
  • 论文略读:Uncertainty-Aware Graph Structure Learning
  • 开源版 PyMOL 如何绘制 新冠病毒 分子结构?
  • Vue单文件组件
  • 打卡day42
  • 【Netty】EventLoopGroup
  • waitpid的waitstatus 含义源码解读
  • Linux 内核中 skb_orphan 的深度解析:从版本差异到核心机制
  • JOIN使用的注意事项
  • HTTP协议解析
  • 话题通信之python实现