QT::拖放事件

Drag拖操作 Drop放操作
将文件拖进TextEdit中,TextEdit自动打开文件读取内容到TextEdit中。
1、数据拖动时会被存储在MIME(Multipurpose internet Mail Extensions)中。
2、在QT中使用QMimeData来表示MIME数据,并使用QDraw来完成数据的转换,
3、而拖放操作都在鼠标事件中完成。
MIME型处理函数
测试函数:
hasText()
hasHtml()
hasUrls()
hasImage()
hasColor()
获取函数:
text()
html()
urls()
imageData()
colordata()
设置函数:       MIME类型:
settext()       text/plain
sethtml()       text/html
seturls()       text/url-list
setimageData()  image/*
setcolordata()  application /x-color
1、鼠标拖入一个数据进入主窗口时,会触发dragEnterEvent处理事件。获取MIME数据。
2、查看是否有url路径(拖入文本文件实质是拖入它的路径)。
3、当松开左键时,数据放入主窗口时,会触发dropEvent事件。
4、获取MIME里的列表,拖入只有一个文件,所以获取列表中的第一个条目。并使用toLocalFile()转换为本地路径。
5、使用QFile和QTextStream将文件中的数据读入编辑器中。
void MainWindow::dragEnterEvent(QDragEnterEvent *e)
{
    if(e->mimeData()->hasUrls())//数据是否包含URL。
        e->acceptProposedAction();//如果是则接收动作。
    else
        e->ignore();//如果不是则忽略。

}
void MainWindow::dropEvent(QDropEvent *e)
{
    const QMimeData *mimi = e->mimeData();//获取mime数据。
    if(mimi->hasUrls())                  //如果数据包中url
    {
        QList<QUrl>urlList = mimi->urls();//获取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());
        }
    }
}
原文地址:https://www.cnblogs.com/osbreak/p/14342642.html