CSDN看到的例子都是针对QMainWindow的,现在来测试一下QWidgets的拖放操作。
一下操作是QT4的,QT5请酌情参考。
首先,新建QT工程,选择QWidget模式:
接下来定义函数,并同时在cpp中实现。注意,如果只声明,不实现,会报错!
下面时实现:
这时候可以编译一下了,没问题通过。如果这里有问题,那么注意检查是不是声明有错误。
这一步证明:MainWindow和Widget同样可以实现dragEnterEvent和dropEvent。
接下来在widget上放置控件:
我只想实现将外部文件拖放如编辑框,所以就专门实现一下这个。
接下来写拖入的回调函数
widget.cpp
#include "widget.h" #include "ui_widget.h" #include//添加头文件 #include //添加头文件 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 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();//支持中文
即可。



