第四十课、拖放事件深度剖析------------------狄泰软件学院

一、Qt中的拖放事件

1、拖放事件概述

(1)、拖放一个文件进入窗口将触发拖放事件

(2)、每一个QWidget对象都能处理拖放事件

(3)、拖放事件的函数为

2、拖放事件中的QMimeData

(1)、QMimeData是Qt中的多媒体数据类

(2)、拖放事件通过QMimeData对象传递数据

(3)、QMimeData支持多种不同的多媒体数据类型

3、常用的MIME类型数据处理函数

4、自定义拖放事件的步骤

(1)、对接收拖放事件的对象调用setAcceptDrops成员函数

(2)、重写dragEnterEvent函数并判断MIME类型

A、期待类型:e->acceptProposedAction()

B、其它数据:e->ignore()

(3)、重写dragEvent()函数并判断MIME类型

A、期待类型:从事件对象中获取MIME数据并处理

B、其它数据:e->ignore()

#include "Widget.h"
#include <QDragEnterEvent>
#include <QDropEvent>
#include <QMimeData>
#include <QList>
#include <QDebug>
#include <QUrl>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    setAcceptDrops(true);//1.在接收拖放事件的对象里调用setAcceptDrops(true)
}

void Widget::dragEnterEvent(QDragEnterEvent *e)//2.重写void dragEnterEvent(QDragEnterEvent *e)
{
    if(e->mimeData()->hasUrls())//A、期待类型:e->acceptProposedAction()
    {
        e->acceptProposedAction();
    }
    else//B、其它数据:e->ignore()
    {
        e->ignore();
    }
}
void Widget::dropEvent(QDropEvent* e)//3.重写void dropEvent(QDropEvent* p)
{
    if(e->mimeData()->hasUrls())//A、期待类型:从事件对象中获取MIME数据并处理
    {
        QList<QUrl> list = e->mimeData()->urls();

        for(int i = 0; i<list.count(); i++)
        {
            qDebug() << list[i].toLocalFile();//打印路径出来
        }
    }
    else//B、其它数据:e->ignore()
    {
        e->ignore();
    }
}

Widget::~Widget()
{
    
}
拖放事件初探

二、文本编辑器中的拖放事件

1、打开文件和拖放文件的异同

(1)、打开和拖放都需要先判断是否有数据未保存(所以调用相同的函数

(2)、保存好数据后打开操作是从弹出的一个文本对话框获取文件路径

(3)、保存好数据后拖放事件是从MimeData里边获取文件路径

(4)、最后通过路径来打开的方式都一样(所以调用相同的函数),所以说区别就是在(2)、(3)

2、文本编辑器拖放事件的解决方案

(1)、调用主窗口对象的setAcceptDrops成员函数

(2)、重写dragEnterEvent函数并判断MIME类型

(3)、重写dragEvent()函数并判断MIME类型后打开文件

void MainWindow::dragEnterEvent(QDragEnterEvent* e)
{
    if(e->mimeData()->hasUrls())
    {
        e->acceptProposedAction();
    }
    else
    {
        e->ignore();
    }
}
void MainWindow::dropEvent(QDropEvent* e)
{
    if(e->mimeData()->hasUrls())
    {
        QList<QUrl> list = e->mimeData()->urls();
        QString path = list[0].toLocalFile();

        QFileInfo fi(path);

        if(fi.isFile())
        {
            preEditorChanged();

            if(!m_isTextChanged)
            {
                openFileToEdit(path);
            }

        }
        else
        {
            showErrorMessage("Canot open a folder");
        }
    }
    else
    {
        e->ignore();
    }

}
文本编辑器的dragEnterEvent(QDragEnterEvent* e)和dropEvent(QDropEvent* e)

修改的文件除了头文件还有:

将onFileOpen()里面的部分代码抽取出来封装成一个函数
void MainWindow::onFileOpen()
{

    preEditorChanged();

    if(!m_isTextChanged)
    {
        QString path = showFileDialog(QFileDialog::AcceptOpen, "open");

        openFileToEdit(path);
    }

}
修改后的onFileOpen()

三、小结

(1)、QWidget对象都能处理拖放事件

(2)、自定义拖放事件的方法

A、对接收拖放事件的对象调用setAcceptDrops成员函数

B、重写dragEnterEvent函数并判断MIME类型

C、重写dragEvent()函数并判断MIME类型

原文地址:https://www.cnblogs.com/gui-lin/p/6415297.html