目录

实现拖拽分2步

1、允许拖拽

2、写拖拽事件

另外一种拖拽的写法

item数据输入这边:

Item数据拖拽输出这边:

分2步


实现拖拽分2步

1、允许拖拽

在构造函数里加入

setAcceptDrops(true);//允许接收拖拽

2、写拖拽事件

这里给的例子是:拖拽文件到控件,实现文件上传。


.h

一个是拖拽进入事件、一个是拖拽放下事件

void dragEnterEvent(QDragEnterEvent *event) override;void dropEvent(QDropEvent *event) override;

.cpp

void TerminalWidget::dragEnterEvent(QDragEnterEvent *event){_isEnter = false;// 拖动进入事件if(event->mimeData()->hasText())// 数据中是否包含URL{event->acceptProposedAction();// 如果数据中包含URL,就接收动作}else{event->ignore();// 如果数据中不包含URL,就忽略该事件}}//拖拽上传void TerminalWidget::dropEvent(QDropEvent *event){// 放下事件const QMimeData *mimeData = event->mimeData();// 获取MIME数据if(mimeData->hasUrls())// 如果数据中包含URL{QList urlList = mimeData->urls();// 获取URL列表// 将其中的第一个URL表示为本地文件路径foreach (auto &var, urlList) {QString fileName = var.toLocalFile();// toLocalFile()转换未本地文件路径if(!fileName.isEmpty())// 文件路径不为空{QFileInfo file(fileName);bool fileType = file.isDir();QString name = fileName.split('/').last();QString remoteName = QString("%1/%2").arg(_currentPath,name);//qDebug()<<remoteName<uploadDir(fileName,_currentPath);}else{_shell->uploadFile(remoteName,fileName,QSsh::SftpOverwriteExisting);}}}refresh();}}

另外一种拖拽的写法:自定义拖拽数据

比如说拖拽treeview里的item,拖拽item显示写入的data。

item拖拽数据写入:

需要结合鼠标移动事件。用到了QMimeDataQDrag

#include #include void TaskTreeView::mouseMoveEvent(QMouseEvent *e){if(e->buttons() & Qt::LeftButton){int distance = (e->pos() - _startPos).manhattanLength();if(distance >= QApplication::startDragDistance()){ //当拖动距离大于一个推荐抖动距离时,表示同意已经拖动操作了createDragData();}}QTreeView::mouseMoveEvent(e);}void TaskTreeView::createDragData(){//qDebug()<currentIndex().parent().isValid()) {auto data = this->currentIndex().data(Qt::UserRole +1).toMap();QMimeData *mimeData = TaskTreeClass::init()->getMimeData(M_ActionDropData,data);QDrag *drag = new QDrag(this);drag->setMimeData(mimeData);drag->exec(Qt::MoveAction);delete drag;}}

Item拖拽数据输出:

分2步

1、在构造函数中设置允许拖拽
this->setAcceptDrops(true);//接受拖拽
2、写拖拽事件

.h

//鼠标拖拽事件void dropEvent(QDropEvent * event) override;//放下void dragEnterEvent(QDragEnterEvent * event) override;//拖入void dragMoveEvent(QDragMoveEvent * event) override;//拖动

.cpp

/** * @brief NodeGraphicsView::dropEvent * @param event */void NodeGraphicsView::dropEvent(QDropEvent *event){if(event->mimeData()->hasFormat(M_ActionDropData)){QVariantMap rcvDataMap = TaskTreeClass::getMimeDataMap(M_ActionDropData,event->mimeData());/*rcvDataMap为拖拽的item里包含的数据,后面对它进行数据处理即可*/ }elseevent->ignore();}/** * @brief NodeGraphicsView::dragEnterEvent * @param event */void NodeGraphicsView::dragEnterEvent(QDragEnterEvent *event){//qDebug()<mimeData()->hasFormat(M_ActionDropData)){event->setDropAction(Qt::MoveAction);event->accept();}else{event->ignore();qDebug()<<"[recvWidget]: dragEnterEvent event ignore";}QGraphicsView::dragEnterEvent(event);}/** * @brief NodeGraphicsView::dragMoveEvent * @param event */void NodeGraphicsView::dragMoveEvent(QDragMoveEvent *event){//qDebug()<mimeData()->hasFormat(M_ActionDropData)){event->setDropAction(Qt::MoveAction);event->accept();}else{event->ignore();qDebug()<<"[recvWidget]: dragEnterEvent event ignore";}QWidget::dragMoveEvent(event);}