QT之拖拽Drag-Drop
效果图
代码
//鼠标点击图片时
void DragWidget::mousePressEvent(QMouseEvent *event)
{
QLabel *child = static_cast<QLabel*>(childAt(event->pos()));
if (!child)
return;
QPixmap pixmap = *child->pixmap();
//将图片数据,以及位置信息存到数据流中
QByteArray itemData;
QDataStream dataStream(&itemData, QIODevice::WriteOnly);
dataStream << pixmap << QPoint(event->pos() - child->pos());
QMimeData *mimeData = new QMimeData;
mimeData->setData("application/x-dnditemdata", itemData);
//开始拖拽
QDrag *drag = new QDrag(this);
//设置拖拽数据,释放的时候可获取
drag->setMimeData(mimeData);
//设置拖拽过程中图片
drag->setPixmap(pixmap);
//设置拖拽图片相对鼠标点击位置
drag->setHotSpot(event->pos() - child->pos());
//将原图片蒙一层背景
QPixmap tempPixmap = pixmap;
QPainter painter;
painter.begin(&tempPixmap);
painter.fillRect(pixmap.rect(), QColor(127, 127, 127, 127));
painter.end();
child->setPixmap(tempPixmap);
//执行拖拽
drag->exec(Qt::CopyAction | Qt::MoveAction, Qt::CopyAction);
//执行完毕后,释放原拖拽对象
child->close();
}
//拖拽移动事件
void DragWidget::dragMoveEvent(QDragMoveEvent *event)
{
if (event->mimeData()->hasFormat("application/x-dnditemdata")) {
if (event->source() == this) {
event->setDropAction(Qt::MoveAction);
event->accept();
} else {
event->acceptProposedAction();
}
} else {
event->ignore();
}
}
//拖拽进入事件
void DragWidget::dragEnterEvent(QDragEnterEvent *event)
{
if (event->mimeData()->hasFormat("application/x-dnditemdata")) {
if (event->source() == this) {
event->setDropAction(Qt::MoveAction);
event->accept();
} else {
event->acceptProposedAction();
}
} else {
event->ignore();
}
}
//释放事件
void DragWidget::dropEvent(QDropEvent *event)
{
//判断接收的是否是指定的对象
if (event->mimeData()->hasFormat("application/x-dnditemdata")) {
//获取拖拽时设置的数据
QByteArray itemData = event->mimeData()->data("application/x-dnditemdata");
QDataStream dataStream(&itemData, QIODevice::ReadOnly);
QPixmap pixmap;
QPoint offset;
dataStream >> pixmap >> offset;
QLabel *newIcon = new QLabel(this);
newIcon->setPixmap(pixmap);
newIcon->move(event->pos() - offset);
newIcon->show();
newIcon->setAttribute(Qt::WA_DeleteOnClose);
if (event->source() == this) {
event->setDropAction(Qt::MoveAction);
event->accept();
} else {
event->acceptProposedAction();
}
} else {
event->ignore();
}
}
结尾
只为记录,只为分享! 愿所写能对你有所帮助。Good Good Study, Day Day Up!