一、拖拽文件获取文件路径
1、效果展示
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、效果展示
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);
}
}*/
}