基本原理
拖放操作包括两个动作:拖动(drag)和放下(drop 或称为放置)
当被拖动时拖动的数据会被存储为 MIME 类型的对象,MIME 类型使用 QMimeData 类来描述。MIME 类型通常由剪贴板和拖放系统使用,以识别不同类型的数据
事件产生的顺序为:QDragEnterEvent、QDragMoveEvnet、QDropEvent
编写拖放程序的步骤
1)、在需要接受放下数据的部件上调用 QWidget::setAcceptDrops()函数以使该部件能接受拖放事件。
2)、启动拖放:通常在 mousePressEvent()或 mouseMoveEvent()函数中启动拖放,记住启动拖放就是调用 QDrag 对象的 exec()函数,因此也可以在 keyPressEvent()等函数中启动拖放(因很少这样做,所以本文不介绍这种情况下的拖放)。在此步把需要拖动的数据保存在 QMimeData 对象中。
3)、重新实现需要接受放下数据的部件的 dragEnterEvent()事件处理函数。
4)、根据需要重新实现 dragMoveEvent 或 dropEvent()函数
文件拖放
win.h
#ifndef WIN_H #define WIN_H #include <QWidget> #include <QDragEnterEvent> #include <QDebug> #include <QMimeData> #include <QList> #include <QUrl> //地址 #include <QFile> QT_BEGIN_NAMESPACE namespace Ui { class Win; } QT_END_NAMESPACE class Win : public QWidget { Q_OBJECT public: Win(QWidget *parent = nullptr); ~Win(); private: Ui::Win *ui; bool readfile(const QString& filename); protected: void dragEnterEvent(QDragEnterEvent*);//鼠标拖拽进入事件 //需要 #include <QDragEnterEvent> void dropEvent(QDropEvent *event); //拖拽放下事件 //当drag为accept状态,然后释放鼠标,就会产生dropEvent。我们可以在这个事件里处理本次拖拽附带的Mime信息 //dragMoveEvent 在控件内拖拽移动事件 //dragLeaveEvent 鼠标拖拽离开控件事件 }; #endif // WIN_H
win.cpp
#include "win.h" #include "ui_win.h" Win::Win(QWidget *parent) : QWidget(parent) , ui(new Ui::Win) { ui->setupUi(this); ui->textEdit->setAcceptDrops(false);//禁止拖放 this->setAcceptDrops(true); //允许拖放 //必须使部件接受放置事件,才会产生以下事件
} Win::~Win() { delete ui; } bool Win::readfile(const QString &filename) { QFile file(filename); if( file.open(QIODevice::ReadOnly | QIODevice::Text)){ ui->textEdit->setText("请自己读取文件内容,放到textEdie中"); } } void Win::dragEnterEvent(QDragEnterEvent *e) { qDebug()<<e->mimeData()->text(); //返回文本 //拖入文件时返回文件路径QString:"file:///C:/Users/asus/Desktop/aa.png file:///C:/Users/asus/Desktop/linsi.txt " //拖入网络图片时:"https://dss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=2152875490,582858957&fm=26&gp=0.jpg" if(e->mimeData()->hasFormat("text/uri-list")){ //hasFormat("text/uri-list") 是指定的类型,返回true //MIME类型为 text/uri-list 通常用来描述一个URI的列表。这些URI可以是文件名,可以是URL或者其他的资源描述符 e->acceptProposedAction(); //接受拖放-可以继续拖放 //特别注意:只有接受才会产生dropEvent事件 //如果没有这句指令,是不会产生dropEvent事件的 }else{ qDebug()<<"不是URL"; } } void Win::dropEvent(QDropEvent *e) { QList<QUrl> urls=e->mimeData()->urls(); //返回拖放时所有文件的路径--QUrl数据类型 //(QUrl("file:///C:/Users/asus/Desktop/aa.png"), QUrl("file:///C:/Users/asus/Desktop/linsi.txt")) if(urls.empty()){return;} QString str=urls.first().toLocalFile(); //从列表中返回第一个地址,并转化为本地文件地址 //"C:/Users/asus/Desktop/aa.png" ui->lineEdit->setText(str); readfile(str); }
上面工程下载地址:链接:https://pan.baidu.com/s/1YLNAD8D_MO-7uuxnHzZ7SQ 提取码:6666