QT6(拖放事件与拖放操作)
QT6拖放操作与MIME数据处理摘要 本文介绍了QT6中拖放操作的核心机制和MIME数据处理方法。MIME(多用途互联网邮件扩展)是数据传输的标准格式,QT通过QMimeData类实现拖放和剪贴板操作。文章详细列出了常见MIME类型(如text/plain、text/uri-list等)及其应用场景,并提供了完整的代码示例展示如何实现文件拖放功能。示例中通过重写dragEnterEvent和dro
·
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();
}
效果展示

更多推荐


所有评论(0)