1.拖放事件
- 拖放一个文件进入窗口时将触发拖放事件
- 每一个QWidget对象都能够处理拖放事件
- 拖放事件的处理函数为:
- void dragEnterEvent(QDragEnterEvent* e) //拖
- void dropEvent(QDropEvent* e); //放
2.拖放事件中的QMimeData
- QMimeData是Qt中的多媒体数据类
- 拖放事件通过QMimeData对象传递数据
- QMimeData支持多种不同类型的多媒体数据
3.自定义拖放事件的步骤
- 对接收拖放事件的对象调用setAcceptDrops成员函数
- 重写dragEnterEvent函数并判断MIME的类型
- 期望数据:e->acceptProposedAction();
- 其他数据:e->ignore()
- 重写dropEvent函数并判断MIME的类型
- 期望数据:从事件对象中获取MIME数据并处理
- 其他数据: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后,会打印该文件的本地路径