QT:拖拽
2024-01-08 06:18:55
    		目录
实现拖拽分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拖拽数据写入:
需要结合鼠标移动事件。用到了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;
    }
}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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
    	本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!