根据上一篇(Qt拖放介绍)介绍里拖放的实现方法,来实现一个简单的拖放例子:两个QLabel之间文字相互拖放。
窗口设置接受拖放:
setAcceptDrops(true);//接收放下事件
3个事件函数:
//鼠标按下事件
void Form::mousePressEvent(QMouseEvent *event)
{
QLabel *child = qobject_cast<QLabel*>(childAt(event->pos()));
if (!child)
return;
QMimeData *mimeData = new QMimeData;
mimeData->setText(child->text());
QDrag *drag = new QDrag(this);
drag->setMimeData(mimeData);
Qt::DropAction dropAction = drag->exec(Qt::CopyAction | Qt::MoveAction);
if (dropAction == Qt::MoveAction)
{
child->clear();
}
}
//拖拽进入事件
void Form::dragEnterEvent(QDragEnterEvent *event)
{
if (event->mimeData()->hasText())
{
if (event->source())
{
event->accept();
}
else
{
event->acceptProposedAction();
}
}
else
{
event->ignore();
}
}
//放下事件
void Form::dropEvent(QDropEvent *event)
{
QLabel *child = qobject_cast<QLabel*>(childAt(event->pos()));
if (!child)
return;
if (event->mimeData()->hasText())
{
const QMimeData *mime = event->mimeData();
child->setText(mime->text());
if (event->source())
{
event->setDropAction(Qt::MoveAction);
event->accept();
}
else
{
event->acceptProposedAction();
}
}
else
{
event->ignore();
}
}
当放下时设置放下动作为移动(Qt::MoveAction),源label清空,放下处的label设置text为QMimeData对象中的数据,从而实现拖放效果。
效果: