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

    科技2024-08-05  27

    一、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类型后打开文件

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

    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()里面的部分代码抽取出来封装成一个函数

     修改后的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类型

    Processed: 0.011, SQL: 8