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

相关推荐
silvamux_3 小时前
豆包 API 调用教程:Python 接入可跑通示例
开发语言·python
wdfk_prog4 小时前
LWIP教程 15:IPv4 与 IPv6——从网络层工作原理到嵌入式工程取舍
运维·开发语言·网络·笔记·学习·智能路由器·ip
棉猴4 小时前
玩游戏学Python10-算术运算符应用2
开发语言·python·玩游戏·游戏编程
tachibana24 小时前
Go 语言的 Map 是否是并发安全的?
开发语言·数据结构·后端·golang·go·语言
后除4 小时前
Go 实战: 使用 Wails v2.15 构建轻量级的桌面应用 - 仿微信登录界面
开发语言·微信·golang
坤坤子吖4 小时前
Linux 进程信号入门——从 Ctrl+C 到 kill
linux·开发语言·c++·笔记·学习
看浪的路人4 小时前
第8讲:RAG 生产化——Go 实现亿级向量召回 + 混合检索 + 重排序 Pipeline
开发语言·后端·golang
tachibana24 小时前
Go 语言 Map 的扩容过程是怎样的?
开发语言·后端·golang·go·语言
念何架构之路4 小时前
go-grpc服务端调用链
开发语言·后端·golang
泡海椒4 小时前
JQuickExcel 大文件排障与调优:从实际路径定位 OOM、临时盘和慢任务
开发语言·数据库·缓存·oracle·excel