- 当鼠标拖拽一个数据进入主窗口时,就会触发dragEnterEvent()事件处理函数
- 获取其中MIME数据
- 查看他是否包含URL路径(拖入文本文件实际就是拖入他的路径)
- 即,event -> mimeData() -> hasUrls()实现
- 有数据接收,否则忽略该事件
- 当松开鼠标左键,将数据放入主窗口时就会触发dropEvent()事件来处理函数
- 获取MIME数据中的URL列表,因为拖入的只有一个文件,所以获取列表中的第一个条目
- 调用toLocakFile()函数将他转换为本地文件路径
- 最后用QFile和QTextStream将文件中的数据读入编辑器中
代码:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QFile>
#include <QTextStream>
#include <QMimeData>
#include <QDragEnterEvent>
#include <QUrl>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
protected:
// 拖动文件进入会触发的事件
void dragEnterEvent(QDragEnterEvent *event);
// 文件放下会触发的事件
void dropEvent(QDropEvent *event);
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
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> urlList = mimeData->urls();
QString fileName = urlList.at(0).toLocalFile();
if(!fileName.isEmpty())
{
QFile file(fileName);
if(!file.open(QIODevice::ReadOnly))
return;
QTextStream in(&file);
ui->textEdit->setText(in.readAll());
}
}
}
拖入桌面的一个.txt文件之后的效果!
关键点:QMimeData数据类型、hasUrls函数
参考:
不二如是:https://fishc.com.cn/thread-77174-1-1.html