QT6(拖放事件与拖放操作)
QT6
拖放事件拖放操作
处理drag,获取MIME数据
void dragEnterEvent(QDragEnterEvent* event) override;
处理drop,使用MIME数据
void dropEvent(QDropEvent* event) override;
什么是MIME?
多用途互联网邮件扩展(multipurpose internet mail extensions)设计之初是为了发送电子邮件时附加多媒体数据
- QMimeData用于扫描存储在剪贴板中的信息,并支持通过拖放机制传输
- QMimeData对象将它们所持有的数据与相应的MIME类型相关联,以确保信息可以在应用程序内,之间安全传输
- “发送”和“接收“MIME类型数据时,必须类型匹配
📋 基本 MIME 类型
MIME 类型 | 常量/标识 | 描述 | 常见用途 |
---|---|---|---|
text/plain | QMimeDatabase::PlainText | 纯文本数据 | 文本复制粘贴、拖放操作 |
text/html | - | HTML 格式文本 | 富文本内容传输 |
text/uri-list | - | 文件路径列表 | 文件拖放操作 |
application/x-color | - | 颜色数据 | 颜色选择器、颜色拖放 |
image/png | - | PNG 图像格式 | 图像数据传输 |
image/jpeg | - | JPEG 图像格式 | 图像数据传输 |
image/bmp | - | BMP 图像格式 | 图像数据传输 |
application/x-qt-image | - | Qt 内部图像格式 | Qt 图像操作 |
🖱️ 拖放操作相关
MIME 类型 | 描述 | 使用场景 |
---|---|---|
application/x-qabstractitemmodeldatalist | QAbstractItemModel 数据 | 模型视图拖放 |
application/x-qstandarditemmodeldatalist | QStandardItemModel 数据 | 标准项目模型拖放 |
application/x-qbytearray | 二进制数据 | 自定义数据拖放 |
📋 剪贴板操作相关
MIME 类型 | 描述 | 示例代码 |
---|---|---|
text/plain | 纯文本数据 | mimeData->setText("Hello") |
text/html | HTML 内容 | mimeData->setHtml("<b>Hello</b>") |
image/png | 图像数据 | mimeData->setImageData(image) |
application/x-color | 颜色数据 | mimeData->setColorData(color) |
📁 文件操作相关
MIME 类型 | 描述 | 使用场景 |
---|---|---|
text/uri-list | 文件/URL 列表 | 文件拖放、URL 传输 |
application/x-qurl | Qt URL 格式 | URL 数据传输 |
inode/directory | 目录类型 | 目录操作 |
🎨 自定义 MIME 类型
MIME 类型 | 示例 | 描述 |
---|---|---|
application/x-custom-type | application/x-myapp-data | 应用程序特定数据 |
text/x-csv | text/x-csv | CSV 数据格式 |
application/json | application/json | JSON 数据格式 |
代码测试
#include "widget.h"
#include "./ui_widget.h"
#include <QMimeData>
#include <QFileInfo>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 设置为接受托拽文件setAcceptDrops(true);ui->plainTextEdit->setAcceptDrops(false);ui->label->setAcceptDrops(false);
}Widget::~Widget()
{delete ui;
}// 使用事件进行布局
void Widget::resizeEvent(QResizeEvent *event)
{QSize size = ui->plainTextEdit->size();// 高度不变,使用widget的宽度ui->plainTextEdit->move(5,5);ui->label->move(5,size.height()+10);ui->plainTextEdit->resize(this->width()-10,size.height());ui->label->resize(this->width()-10,this->height()-size.height()-20);// 表示已经处理该事件event->accept();
}void Widget::dragEnterEvent(QDragEnterEvent *event)
{ui->plainTextEdit->clear();ui->plainTextEdit->appendPlainText("进入dragEnterEvent,MimeData的formate");for(auto &item:event->mimeData()->formats()){ui->plainTextEdit->appendPlainText(item);}ui->plainTextEdit->appendPlainText("进入dragEnterEvent,MimeData的urls");for(auto &item:event->mimeData()->urls()){ui->plainTextEdit->appendPlainText(item.toString());}// 当拖拽的是一张图片时if(event->mimeData()->hasUrls()){// 实际上获取到的是它的链接地址QString fileName = event->mimeData()->urls().at(0).fileName();QFileInfo fileInfo(fileName);QString ex =fileInfo.suffix().toUpper();if(ex == "JPG"){event->acceptProposedAction(); // 接受这个操作}else{event->ignore();}}else{event->ignore();}
}void Widget::dropEvent(QDropEvent *event)
{QString filePath = event->mimeData()->urls().at(0).path();filePath = filePath.right(filePath.length() - 1);QPixmap pixmap(filePath);ui->label->setPixmap(pixmap);ui->label->setScaledContents(true);event->accept();
}
效果展示