QT:拖拽

2024-01-08 06:18:55

目录

实现拖拽分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<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。

item拖拽数据写入:

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

#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;
    }
}

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里包含的数据,后面对它进行数据处理即可
        */       
    }
    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);
}

文章来源:https://blog.csdn.net/Yanjun2i/article/details/135388282
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。