QT:从外部拖拽文件到QWidget中,获取其文件的路径(单文件和多文件)

目录

程序运行实例

实现步骤

完整示例代码


 

程序运行实例

 

 

实现步骤

1、启用拖放事件

setAcceptDrops(true);

2、重写 dragEnterEvent 和 dropEvent 事件

//拖动进入事件
void Widget::dragEnterEvent(QDragEnterEvent *ev)
{
    if(ev->mimeData()->hasUrls())//是否是文件路径
    {
        ev->accept();//接收拖动进入事件
    }
    //ev->ignore();//若忽略该事件,则不会发生之后的事件,拖放到此结束
}


//拖动放下事件
void Widget::dropEvent(QDropEvent *ev)
{
    if(ev->mimeData()->hasUrls())
    {
        QList<QUrl> urls = ev->mimeData()->urls();
        
        //单个文件路径
        //QString fileName = urls.at(0).toLocalFile();
        //qDebug()<<fileName;

        //多个文件路径
        for(int i=0; i<urls.size(); i++)
        {
            qDebug()<<urls.at(i).toLocalFile();
        }
    }
}

 

 

完整示例代码

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

protected:
    void dragEnterEvent(QDragEnterEvent* ev) override;
    void dropEvent(QDropEvent* ev) override;

private:
    Ui::Widget *ui;
};

#endif // WIDGET_H

 

#include "widget.h"
#include "ui_widget.h"
#include <qdebug.h>
#include <QDragEnterEvent>
#include <QDropEvent>
#include <QMimeData>
#include <QUrl>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    this->setAcceptDrops(true);

}

Widget::~Widget()
{
    delete ui;
}

void Widget::dragEnterEvent(QDragEnterEvent *ev)
{
    if(ev->mimeData()->hasUrls())
    {
        ev->accept();//接收拖动进入事件
    }
    //ev->ignore();//若忽略该事件,则不会发生之后的事件,拖放到此结束
}

void Widget::dropEvent(QDropEvent *ev)
{
    if(ev->mimeData()->hasUrls())
    {
        QList<QUrl> urls = ev->mimeData()->urls();

        for(int i=0; i<urls.size(); i++)
        {
            qDebug()<<urls.at(i).toLocalFile();
        }
    }
}