基本原理
拖放操作包括两个动作:拖动(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\nfile:///C:/Users/asus/Desktop/linsi.txt\n"
//拖入网络图片时:"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);
}
本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓