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后,会打印该文件的本地路径

相关推荐
程与留1 小时前
15_国际化和本地化:tr()、ts 文件、QM 文件、多语言切换
c++·qt
程与留3 小时前
14_Qt 样式表(QSS)入门(语法、选择器、美化实战)
c++·qt
Quz9 小时前
QML 拖拽篇:接收拖拽与数据交换
qt
Interview Aid11212 小时前
TikTok OA 四题分享|半小时内 AC,题目基本都是实现题
java·开发语言·算法·面试·职场和发展
CoderIsArt19 小时前
C#中UI 线程与 Dispatcher
开发语言·ui·c#
AI情绪识别开源1 天前
检信 ALLEMOTION OS 加密打包可执行程序 — 全面测试报告版本: v1.3功能测试 / 性能测试 /
开发语言·数据结构·人工智能·功能测试
「QT(C++)开发工程师」1 天前
C++ auto 用法详解
开发语言·c++
OPEN-F1 天前
C++STL教程:容器适配器与实用工具
开发语言·c++
yaoxin5211231 天前
507. Java 反射 - 在 BeanFactory 中实现依赖注入
java·开发语言