Qt之Drop 实现拖放文件

首先这个Widget要设置

setAcceptDrops(true);//启用放下操作

然后要重写drop的4大操作, 即enter leave move drop。

//当用户拖动文件到窗口部件上时候,就会触发dragEnterEvent事件
void MainWindow::dragEnterEvent(QDragEnterEvent *e)
{
    if(e->mimeData()->hasFormat("text/uri-list")) //只能打开文本文件
        e->acceptProposedAction(); //可以在这个窗口部件上拖放对象
}

 

//leave,表示离开本窗口,即用户拖动东西进来,但是没有drop放下来又走了,不过本次实现没用

void  MainWindow::dragLeaveEvent ( QDragLeaveEvent * e ) 
{
 
}
//move,用户拖动东西在目标窗口内游荡,在拖到某此点位时,应提示允许其drop放下。比如目标窗口里有若干个坑,那么当鼠标over到坑上时,就应该提示这里可以drop并改变鼠标形状。暂时没用


void  MainWindow::dragMoveEvent ( QDragMoveEvent * e ) 
{
	
}

 

//当用户放下这个文件后,就会触发dropEvent事件,即某个点位用户放开了鼠标完成drop操作。一般来说,应该解析出该drag所携带的 data ,然后做一个插入操作。调用acceptProposedAction()来通知源窗口,说此操作已经被接受,源窗口应于此时做一个删除/复制操作。
void MainWindow::dropEvent(QDropEvent *e)
{
    QList<QUrl> urls = e->mimeData()->urls();
    if(urls.isEmpty())
        return ;

    QString fileName = urls.first().toLocalFile();

    foreach (QUrl u, urls) {
        qDebug()<<u.toString();
    }
    qDebug()<< urls.size();

    if(fileName.isEmpty())
        return;

    if(readFile(fileName))
        setWindowTitle(tr("%1 - %2").arg(fileName).arg("Drag File"));
}
bool MainWindow::readFile(const QString &fileName) //读文件
{
    QFile file(fileName);
    if(!file.open(QFile::ReadOnly | QFile::Text))
          return false;

    QByteArray data;
    data = file.readAll();
    ui->textEdit->setText(QString::fromLocal8Bit(data));
    return true;
}

这样就结束啦,拖拽到富文本里就会将内容打印出来

demo代码:除了ui添加一个textedit。其他文件没内容

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDragEnterEvent>
#include <QMimeData>
#include <QFile>
#include <QUrl>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    setCentralWidget(ui->textEdit);
    ui->textEdit->setAcceptDrops(false);
    setAcceptDrops(true);
    setWindowTitle(tr("Text Editor"));

}

MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::dragEnterEvent(QDragEnterEvent *e)
{
    if(e->mimeData()->hasFormat("text/uri-list")) //只能打开文本文件
        e->acceptProposedAction(); //可以在这个窗口部件上拖放对象
}

void MainWindow::dropEvent(QDropEvent *e) //释放对方时,执行的操作
{
    QList<QUrl> urls = e->mimeData()->urls();
    if(urls.isEmpty())
        return ;

    QString fileName = urls.first().toLocalFile();

    foreach (QUrl u, urls) {
        qDebug()<<u.toString();
    }
    qDebug()<< urls.size();

    if(fileName.isEmpty())
        return;

    if(readFile(fileName))
        setWindowTitle(tr("%1 - %2").arg(fileName).arg("Drag File"));
}

bool MainWindow::readFile(const QString &fileName) //读文件
{
    QFile file(fileName);
    if(!file.open(QFile::ReadOnly | QFile::Text))
          return false;

    QByteArray data;
    data = file.readAll();
    ui->textEdit->setText(QString::fromLocal8Bit(data));
    return true;
}

 

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值