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();
}

效果展示

在这里插入图片描述

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐