CSDN看到的例子都是针对QMainWindow的,现在来测试一下QWidgets的拖放操作。
一下操作是QT4的,QT5请酌情参考。
首先,新建QT工程,选择QWidget模式:
接下来定义函数,并同时在cpp中实现。注意,如果只声明,不实现,会报错!
下面时实现:
这时候可以编译一下了,没问题通过。如果这里有问题,那么注意检查是不是声明有错误。
这一步证明:MainWindow和Widget同样可以实现dragEnterEvent和dropEvent。
接下来在widget上放置控件:
我只想实现将外部文件拖放如编辑框,所以就专门实现一下这个。
接下来写拖入的回调函数
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QDragEnterEvent> //添加头文件
#include <QUrl> //添加头文件
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
// 拖动进入事件
void Widget::dragEnterEvent(QDragEnterEvent *event)
{
// 数据中是否包含URL,如果是则接收动作,否则忽略该事件
if(event->mimeData()->hasUrls())
event->acceptProposedAction();
else event->ignore();
}
// 放下事件
void Widget::dropEvent(QDropEvent *event)
{
// 获取MIME数据
const QMimeData *m = event->mimeData();
// 如果数据中包含URL
if(mimeData->hasUrls()){
// 获取URL列表
QList<QUrl> urlList = m->urls();
// 将其中第一个URL表示为本地文件路径
QString fileName = urlList.at(0).toLocalFile();
// 如果文件路径不为空
if(!fileName.isEmpty()){
// 转为char*
QByteArray qByteArrary = fileName.toLatin1();
char* filePath = qByteArrary.data();
// 判断当前控件是否被鼠标选中
if(ui->lineEdit->underMouse()){
ui->lineEdit->setText(filePath);
}
}
}
}
就可以了。下面看一下效果
拖入文件放入:
大功告成。
TIPS:貌似不支持中文,将字符串转换改为:
QByteArray qByteArrary = fileName.toAscii();//支持中文
即可。