Qt——拖放事件深度剖析

1.拖放事件

  • 拖放一个文件进入窗口时将触发拖放事件
  • 每一个QWidget对象都能够处理拖放事件
  • 拖放事件的处理函数为:
    • void dragEnterEvent(QDragEnterEvent* e) //拖
    • void dropEvent(QDropEvent* e); //放

2.拖放事件中的QMimeData

  • QMimeData是Qt中的多媒体数据类
  • 拖放事件通过QMimeData对象传递数据
  • QMimeData支持多种不同类型的多媒体数据

3.自定义拖放事件的步骤

  1. 对接收拖放事件的对象调用setAcceptDrops成员函数
  2. 重写dragEnterEvent函数并判断MIME的类型
    1. 期望数据:e->acceptProposedAction();
    2. 其他数据:e->ignore()
  3. 重写dropEvent函数并判断MIME的类型
    1. 期望数据:从事件对象中获取MIME数据并处理
    2. 其他数据:e->ignore()

Widget.h

复制代码
#include <QWidget>

class Widget : public QWidget
{
    Q_OBJECT

protected:
    void dragEnterEvent(QDragEnterEvent* e);
    void dropEvent(QDropEvent* e);
public:
    explicit Widget(QWidget *parent = nullptr);
    ~Widget() override;
};

Widget.cpp

复制代码
#include "Widget.h"
#include <QDragEnterEvent>
#include <QDropEvent>
#include <QDebug>
#include <QList>
#include <QUrl>
#include <QMimeData>

Widget::Widget(QWidget *parent) : QWidget(parent)
{
    setAcceptDrops(true);
}

void Widget::dragEnterEvent(QDragEnterEvent* e)
{
    if( e->mimeData() -> hasUrls() )
    {
        e->acceptProposedAction();
    }
    else
    {
        e->ignore();
    }
}
void Widget::dropEvent(QDropEvent* e)
{
    if( e->mimeData()->hasUrls() ) //hasUrls() 检查拖放数据中是否包含URL列表
    {
        QList<QUrl> list = e->mimeData()->urls();
        for( int i=0; i<list.count(); i++)
        {
            qDebug() << list[0].toLocalFile(); //输出文件的本地路径
        }
    }
    else
    {
        e->ignore();
    }
}

将文件拖放到widget后,会打印该文件的本地路径

相关推荐
坐吃山猪5 小时前
【Nanobot】README09_LEVEL4 添加新聊天渠道
开发语言·网络·python·源码·nanobot
shehuiyuelaiyuehao6 小时前
算法27,二维前缀和
开发语言·python·算法
IpdataCloud6 小时前
企业安全运营中,如何用IP风险识别工具快速发现异常终端?操作指南
开发语言·php
兩尛6 小时前
C++多线程,并发
java·开发语言
计算机安禾6 小时前
【c++面向对象编程】第29篇:定位new(placement new):在指定内存上构造对象
开发语言·c++·算法
计算机安禾6 小时前
【c++面向对象编程】第27篇:空类的大小为什么是1?——C++对象标识的秘密
开发语言·c++·算法
河阿里6 小时前
Python容器:特性、区别和使用场景
开发语言·python
我不是8神6 小时前
面试题:Gorutine泄露的条件有哪些?
java·开发语言
奇树谦6 小时前
QListView和QListWidget区别详细说明
开发语言