文件拖放是现代软件所不能缺少的一个重要功能,其提供了一种在应用程序内部。甚至是在应用程序之间进行信息交互的机制。拖放是由两部分组成的,拖动和释放。拖动是将被拖放的对象进行移动—-是一个按压鼠标并移动的过程,释放是将拖放对象放下–松开鼠标的的过程。下面例子中创建一个例子程序将文本文档,拖入释放后显示文本文件里面的内容
1.新建Qt工程,并在对应ui文件中加入一个TextEdit控件。
MainWindow.h
在MainWindow的头文件中重新声明dragEnterEvent和dropEvent两个函数
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
protected:
void dragEnterEvent(QDragEnterEvent *event);
void dropEvent(QDropEvent *event);
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
mainwindow.cpp
在此文件中对上述两个函数进行实现。在mainWindow的构造函数中设置textEdit的acceptdrops为false 设置mainWindow的acceptdrops为true的目的是在文件拖入窗体后释放的时候,textEdit不接收释放事件,而是将释放事件交由mainwindow我们自己实现的函数进行处理。如果textEdit 的acceptdrops为true,mainwindow的acceptdrops设置为false.在程序运行的时候会出现,把文件拖入窗体,在窗体中仅仅显示的是文件的路径和名字,而文本内容并不显示,跟踪发现这时候,我们自己重新实现的dropevent函数没有进行调用。故要保证mainwidow获取拖动的释放事件。
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDragEnterEvent>
#include <QUrl>
#include <QFile>
#include <QTextStream>
#include <QMimeData>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->textEdit->setAcceptDrops(false);
setAcceptDrops(true);
//这两个setAcceptDrops的作用是关闭textEdit的获取释放释放事件,而是让MainWidow去截获此事件
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::dragEnterEvent(QDragEnterEvent *event)
{
if(event->mimeData()->hasUrls())//数据是否包含URls
{
event->acceptProposedAction();//接收动作
//若不添加此函数,则外部文件无法添加到窗体中
}
else
event->ignore();//忽略事件
}
void MainWindow::dropEvent(QDropEvent *event)
{
qDebug()<<"dropEvent";
const QMimeData *mimeData = event->mimeData();//获取mimie数据
if(mimeData->hasUrls())
{
QList<QUrl> urlList = mimeData->urls();//获取url列表
QString fileName = urlList.at(0).toLocalFile();//将第一个URL作为本地文件路径
qDebug()<<"fileName:"<<fileName;
if(!fileName.isEmpty())
{
QFile file(fileName);//建立QFile对象,并且以只读方式打开该文件
if(!file.open(QIODevice::ReadOnly))
{
qDebug()<<"hello";
return;
}
QTextStream in(&file);
ui->textEdit->setText(in.readAll());
}
}
}
上述代码中的drapenterevent函数是在将文件拖入框体就会自动调用的。在调用的acceptProposedAction函数后,文档才能被拖到窗体中还,否则不能拖入。在调用了此函数后,在拖入后,释放鼠标后会自动调用dropEvent函数。在dropEvent函数中使用mimeData去获取数据。然后从mimeData中去获取拖入的文件列表(有可能拖入的不是一个文件),然后将第一个url所指定的文件以可读方式打开,并将其中内容全部读取并设置到之前在ui文件中放置的textEdit控件中进行显示。