目录
在构造函数里加入
setAcceptDrops(true);//允许接收拖拽
这里给的例子是:拖拽文件到控件,实现文件上传。
.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<QUrl> 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<<fileName;
if(fileType){
_shell->uploadDir(fileName,_currentPath);
}else{
_shell->uploadFile(remoteName,fileName,QSsh::SftpOverwriteExisting);
}
}
}
refresh();
}
}
?
比如说拖拽treeview里的item,拖拽item显示写入的data。
需要结合鼠标移动事件。用到了QMimeData、QDrag
#include <QDrag>
#include <QMouseEvent>
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()<<"0";
//必须是非顶层item才可以移动数据
if(this->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;
}
}
this->setAcceptDrops(true);//接受拖拽
.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里包含的数据,后面对它进行数据处理即可
*/
}
else
event->ignore();
}
/**
* @brief NodeGraphicsView::dragEnterEvent
* @param event
*/
void NodeGraphicsView::dragEnterEvent(QDragEnterEvent *event)
{
// qDebug()<<"[recvWidget]:dragEnterEvent";
if(event->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()<<"[recvWidget]: dragEnterEvent event ";
if(event->mimeData()->hasFormat(M_ActionDropData)){
event->setDropAction(Qt::MoveAction);
event->accept();
}
else{
event->ignore();
qDebug()<<"[recvWidget]: dragEnterEvent event ignore";
}
QWidget::dragMoveEvent(event);
}