QT实现拖放文件

首先这个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 urls = e->mimeData()->urls();
    if(urls.isEmpty())
        return ;

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

    foreach (QUrl u, urls) {
        qDebug()<textEdit->setText(QString::fromLocal8Bit(data));
    return true;
}

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

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

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include 
#include 
#include 
#include 
#include 
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 urls = e->mimeData()->urls();
    if(urls.isEmpty())
        return ;

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

    foreach (QUrl u, urls) {
        qDebug()<textEdit->setText(QString::fromLocal8Bit(data));
    return true;
}

 

你可能感兴趣的:(Qt)