zoukankan      html  css  js  c++  java
  • 第四十课、拖放事件深度剖析------------------狄泰软件学院

    一、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类型

  • 相关阅读:
    2018-08-07
    2018-08-06
    2018-08-03
    安装mysql
    iOS-----------关于组件化
    QQ路径
    iOS----------viewcontroller中的dealloc方法不调用
    【2020Python修炼记】前端开发之 JavaScript 的 BOM 和 DOM 操作
    【2020Python修炼记】前端开发之 JavaScript 内置方法
    【2020Python修炼记】前端开发之 JavaScript 函数
  • 原文地址:https://www.cnblogs.com/gui-lin/p/6415297.html
Copyright © 2011-2022 走看看