qt5--拖放

基本原理

拖放操作包括两个动作:拖动(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);

}

上面工程下载地址:链接:https://pan.baidu.com/s/1YLNAD8D_MO-7uuxnHzZ7SQ    提取码:6666    

 

 

 

 

 

 

 

posted @ 2020-10-03 20:40  天子骄龙  阅读(364)  评论(0编辑  收藏  举报