#include<QDropEvent>
拖拽功能跟鼠标点击时间很类似,但是多了数据拷贝,功能许可的要求;
实现拖拽功能时,基本用到的重写函数为:根据控件要求选择性重写函数
void mousePressEvent(QMouseEvent *event);//鼠标点击时触发
void dragEnterEvent(QDragEnterEvent *event);//拖进目标控件时触发
void dragLeaveEvent(QDragLeaveEvent *event);//离开接收控件时触发,(进去不放,又拖出来)
void dragMoveEvent(QDragMoveEvent *event);//在接收控件内拖着移动
void dropEvent(QDropEvent *event);//松开鼠标时触发
在接收的控件里我们需要允许该控件接收信息,所以要在构造函数里setAcceptDrag(true);允许放下信息;
实现的基本思路:函数里有event指针参数,所以当触发点击事件时,点击位置的信息保存在该指针里,在放下的地方,把指针里带的数据在释放出来;当然,无论哪个函数都需要许可,event->accept()允许拖拽,所以,我们可以通过判断鼠标event所携带的数据来选择性执行不同的操作;
重点在数据的拷贝和释放;在mousePressEvent中拷贝,在dropEvent中释放(根据鼠标中携带的数据改变目标点的数据);
以图片为例:url,按钮......都可以作为信息
QLabel*p=static_cast<QLabel*>(childAt(event->pos()))
获取点击位置的控件label,转换为可操作的标签label;
QPixmap pix=*p->pixmap();
获取点击控件的属性,数据,并记录,(此处是图片)
QByteArray arr;
QDataStream data(&arr,QIoDevice::WriteOnly);
data<<pix<<QPoint(event->pos()-p->pos());写入
data>>pix>>QPoint(event->pos()-p->pos());读出
QMimeData*min=new QMimeData();
min->setData("图片",arr);
QDrag *drag=new QDrag(this);
drag->setMimeData(min);
drag->setPixmap(pixmap)//拖动过程中显示的样式(图片)
drag->setHotSpot(event->pos()-p->pos())鼠标位置
drag->exec();执行拖动