Qt实现拖拽文件

1、拖拽文件获取文件路径

1.1、效果展示

1.2、具体代码

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

实现文件拖拽到窗体主要是重写:

void dragEnterEvent(QDragEnterEvent*event) Q_DECL_OVERRIDE; //文件拖拽到窗体内,触发
void dropEvent(QDropEvent *event) Q_DECL_OVERRIDE; //文件拖拽到窗体内,释放,触发
#ifndef
#define

#include <QWidget>
#include <QDebug>
#include <QDropEvent>
#include <QDragEnterEvent>
#include <QMimeData>
#include <QLineEdit>
#include <QVBoxLayout>

class DragFile : public QWidget
{
    Q_OBJECT
public:
    explicit DragFile(QWidget *parent = nullptr);
    ~DragFile();

    void dragEnterEvent(QDragEnterEvent*event) Q_DECL_OVERRIDE;
    void dragMoveEvent(QDragMoveEvent *event) Q_DECL_OVERRIDE;
    void dropEvent(QDropEvent *event) Q_DECL_OVERRIDE;
   
    QLineEdit* lineEdit;

};

#endif// DRAGFILE_H
#include "dragfile.h"

DragFile::DragFile(QWidget *parent) : QWidget(parent)
{
    lineEdit = new QLineEdit;
    lineEdit->setEnabled(false);
    QVBoxLayout* mainLayout = new QVBoxLayout(this);
    mainLayout->addStretch();
    mainLayout->addWidget(lineEdit);

    this->setAcceptDrops(true); //必须设置,不然无法接收拖放事件
}
DragFile::~DragFile()
{

}

void DragFile::dragEnterEvent(QDragEnterEvent *event) //拖动文件到窗口,触发
{
    if(event->mimeData()->hasUrls())
    {
        event->acceptProposedAction(); //事件数据中存在路径,方向事件
    }
    else
    {
        event->ignore();
    }
}

void DragFile::dragMoveEvent(QDragMoveEvent *event) //拖动文件到窗口移动文件,触发
{

}

void DragFile::dropEvent(QDropEvent *event) //拖动文件到窗口释放文件,触发
{
    const QMimeData *mimeData = event->mimeData();
    if(mimeData->hasUrls())
    {
        QList<QUrl> urls = mimeData->urls();
        QString fileName = urls.at(0).toLocalFile();

        lineEdit->setText(fileName);
     }
}

2、拖拽文件获取文件内容

有了上面的铺垫,我们就已经可以获取到文件的路径了,有了路径,剩下的就是怎么读取文件了,下例是拖拽文件并将文件内容更新到表格中:

2.1、效果展示

2.2、具体代码

#ifndef
#define

#include <QMainWindow>
#include <QTableView>
#include <QStandardItemModel>
#include <QHeaderView>
#include <QDragEnterEvent>
#include <QMimeData>
#include <QDebug>
#include <QFile>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

protected:
    void dragEnterEvent(QDragEnterEvent*event); //文件拖拽到窗体内,触发
    void dropEvent(QDropEvent *event); //文件拖拽到窗体内,释放,触发

private:
    Ui::MainWindow *ui;
    QTableView* m_Table;
    QStandardItemModel* m_TableModel;
};
#endif// MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    m_Table = new QTableView;
    this->setCentralWidget(m_Table);
    m_TableModel = new QStandardItemModel;
    m_Table->setModel(m_TableModel);

    m_Table->horizontalHeader()->setStyleSheet("QHeaderView::section{background:rgba(85, 127, 75, 0.3)}");
    m_Table->setAlternatingRowColors(true);
    m_Table->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    m_Table->setSelectionBehavior(QAbstractItemView::SelectRows);
    m_Table->setEditTriggers(QAbstractItemView::NoEditTriggers);


    this->setAcceptDrops(true);
}

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

void MainWindow::dragEnterEvent(QDragEnterEvent* event) //文件拖拽到窗体内,触发
{
    if(event->mimeData()->hasUrls())
    {
        event->acceptProposedAction(); //事件数据中存在路径,方向事件
    }
    else
    {
        event->ignore();
    }
}
void MainWindow::dropEvent(QDropEvent* event) //文件拖拽到窗体内,释放,触发
{
    const QMimeData *mimeData = event->mimeData();
    if(mimeData->hasUrls())
    {
        QList<QUrl> urls = mimeData->urls();
        int column_length = urls.length();

        //1.清空原始数据再加入文件数据
        m_TableModel->clear();
        QStringList qstrListHeader;
        for(int i=0; i<column_length; i++)
        {
            QString H = "数据 " + QString::number(i);
            qstrListHeader << H;
        }
        m_TableModel->setHorizontalHeaderLabels(qstrListHeader);


        for(int j=0; j<column_length; j++)
        {
            QString fileName = urls.at(j).toLocalFile();
            QStringList column_data;

            if (fileName.isEmpty())
                return;

            //读取文件数据
            QFile file(fileName);
            if (file.open(QIODevice::ReadOnly | QIODevice::Text))
            {
                while (!file.atEnd())
                {
                    QByteArray line = file.readLine();
                    QString data(line);
                    if(data.contains("\n"))
                        data.remove("\n");
                    column_data << data;
                }
                file.close();
            }

            //更新到表格
            for(int i=0; i<column_data.length(); i++)
            {
                m_TableModel ->setItem(i, j, new QStandardItem(column_data[i]));
                m_TableModel->item(i, j)->setTextAlignment(Qt::AlignCenter);
            }
        }
    }

    //================================================================================

    /*if(mimeData->hasUrls())
    {
        QList<QUrl> urls = mimeData->urls();
        int column_length = urls.length();

        for(int j=0; j<column_length; j++)
        {
            QString fileName = urls.at(j).toLocalFile();
            QStringList column_data;

            if (fileName.isEmpty())
                return;

            //读取文件数据
            QFile file(fileName);
            if (file.open(QIODevice::ReadOnly | QIODevice::Text))
            {
                while (!file.atEnd())
                {
                    QByteArray line = file.readLine();
                    QString data(line);
                    if(data.contains("\n"))
                        data.remove("\n");
                    column_data << data;
                }
                file.close();
            }

            //更新到表格
            QList<QStandardItem *> new_column;
            for(int i=0; i<column_data.length(); i++)
            {
                //2.保留原始数据直接追加文件数据
                new_column.append(new QStandardItem(column_data[i]));
            }
            m_TableModel->insertColumn(m_TableModel->columnCount(),new_column);
        }
    }*/
}

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值