首先这个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;
}