拖放包括两个基本动作:拖动、放下。
因此一般需要实现两个事件:
示例问题:通过拖放文件实现Qt应用直接读取文本文件
解决:重写两个基本事件实现拖放识别文件并实现文件读取和显示。
另外,为识别文件类型,在剪贴板和拖放系统中常使用MIME类型,Qt中的实现为QMimeData类。 可以通过官方示例MIMETypeBrowser检索所有的MIME类型。
示例代码如下:
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
textEdit=new QTextEdit;
setCentralWidget(textEdit);
setWindowTitle(tr("Drag and drop test"));
textEdit->setAcceptDrops(false);
this->setAcceptDrops(true);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::dragEnterEvent(QDragEnterEvent *event)
{
if(event->mimeData()->hasFormat("text/uri-list"))
event->acceptProposedAction();
}
void MainWindow::dropEvent(QDropEvent *event)
{
QList<QUrl> urls=event->mimeData()->urls();
if(urls.isEmpty())return ;
QString fileName=urls.first().toLocalFile();
if(fileName.isEmpty())return ;
if(readFile(fileName))
setWindowTitle(QString(fileName+"-DragFile"));
}
bool MainWindow::readFile(const QString &fileName)
{
QFile fileToRead(fileName);
if(!fileToRead.open(QFile::ReadOnly|QFile::Text))//读
{
textEdit->setText(tr("couldn't open the file for reading"));
return false;
}
QTextStream in(&fileToRead);
textEdit->append(in.readAll());
in.flush();
fileToRead.close();
return true;
}
运行效果如下: