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

1、效果展示

Qt--实现拖拽文件_#include


2、具体代码

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

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);
}
}

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

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

1、效果展示

Qt--实现拖拽文件_数据_02

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);
}
}*/
}