拖放操作分爲拖動(Drag)和放下(Drop)兩種操作,當數據拖動時會被存儲爲MIME(Multipurpose Internet Mail Extensions)類型。Qt中使用QMimeData類型來表示MIME數據,使用QDrag類來完成數據的轉移,而整個拖動操作都是在幾個鼠標的事件和拖放事件中完成的。
寫一個項目完成使用拖放打開文件的操作。
新建Qt Widgets應用,項目名爲mydragdrop其他步驟默認。
在設計模式下拖入一個TextEdit控件。
在mainwindow.h中添加函數聲明
protected:
void dragEnterEvent(QDragEnterEvent *event);//拖動進入事件
void dropEvent(QDropEvent *event);//放下事件
在mainwindow.cpp中添加文件包含
#include <QDragEnterEvent>
#include <QUrl>
#include <QFile>
#include <QTextStream>
#include <QMimeData>
在構造函數中加如一行代碼,這樣主窗口就可以接收放下事件了。
setAcceptDrops(true);
實現兩個事件處理函數
void MainWindow::dragEnterEvent(QDragEnterEvent *event)
{
if(event->mimeData()->hasUrls())//數據中是否包含url
{
event->acceptProposedAction();//如果是則接收動作
}
else
{
event->ignore();//否則忽略該事件
}
}
void MainWindow::dropEvent(QDropEvent *event)
{
//放下事件
const QMimeData* mimeData=event->mimeData();//獲取MIME數據
if(mimeData->hasUrls())//如果數據中包含url
{
QList<QUrl> urlList=mimeData->urls();//獲取url列表
//將其中第一個url表示爲本地文件路徑
QString fileName=urlList.at(0).toLocalFile();
if(!fileName.isEmpty())//如果文件路徑不爲空
{
QFile file(fileName);//建立QFile對象,並且以只讀方式打開文件
if(!file.open(QIODevice::ReadOnly))
return;
QTextStream in(&file);//建立文本流對象
ui->textEdit->setText(in.readAll());//將文件中所有內容讀入編輯器
}
}
}
當鼠標拖動一個數據進入主窗口時,就會觸發dragEnterEvent事件處理函數,從而獲取其中的MIME數據;然後查看它是否包含路徑,因爲拖入的文本文件實際就是拖入了它的路徑,這就是event->mimeData()->hasUrls()實現的功能。如果有這樣的數據就接收它,否則忽略。因爲之拖入一個文件,所以取urlList.at(0),然後使用toLocalFile函數轉爲本地文件路徑,最後使用QFile和QTextStream將文件中的數據讀入編輯器中。
運行效果