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);

}

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值