一、如何设置文件拖入
新建一个widget工程
在widget的构造函数添加 setAcceptDrops(true);
在widget头文件,类中添加下面函数
protected:
void dragEnterEvent(QDragEnterEvent *event); // 拖动进入事件
void dropEvent(QDropEvent *event); // 放下事件
然后重写函数功能
void aes_tool::dragEnterEvent(QDragEnterEvent *event)
{
if(event->mimeData()->hasUrls()) // 数据中是否包含URL
event->acceptProposedAction(); // 如果是则接收动作
else event->ignore(); // 否则忽略该事件
}
void aes_tool::dropEvent(QDropEvent *event)
{
const QMimeData *mimeData = event->mimeData(); // 获取MIME数据
if(mimeData->hasUrls()){ // 如果数据中包含URL
QList<QUrl> urlList = mimeData->urls(); // 获取URL列表
// 将其中第一个URL表示为本地文件路径
QString fileName = urlList.at(0).toLocalFile();
if(!fileName.isEmpty()){ // 如果文件路径不为空
QFile file(fileName); // 建立QFile对象并且以只读方式打开该文件
qDebug() << "filename: " << fileName;
if(!file.open(QIODevice::ReadOnly)) return;
QTextStream in(&file); // 建立文本流对象
ui->inTextEdit->setText(in.readAll());// 将文件中所有内容读入编辑器
}
}
}
然后在源文件上添加需要的头文件
#include <QDragEnterEvent>
#include <QMimeData>
#include <QUrl>
#include <QFile>
#include <QTextStream>
再在ui中添加一些显示控件(这里不一一列举了)。
编译运行,效果如下。
然后将文件拖入里面,发现只会显示文件名路径,而不是文件内容
在定位问题中发现文件拖入后并没有进入 dragEnterEvent 跟 dropEvent 函数
最后发现是控件的问题,当前控件是 QTextEdit ,这个控件本身就自带文件拖入的功能,并且实现了自己的拖入函数。
解决办法有两个,一个是不要使用此控件,改换其他。
另外一个可以在ui界面取消勾选 acceptDrops 。(在QWidget类下面)
另外,不要使用管理员权限运行程序,会导致无法拖入文件的功能,具体原因未知