我的QT Creator學習筆記(十一)——應用程序主窗口QMainWindow之拖放操作

拖放操作分爲拖動(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將文件中的數據讀入編輯器中。

運行效果

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章