介绍
拖放的启动和结束
1.启动拖放: 通过调用QDrag::exec()启动,在拖放操作结束之前不会返回该函数,调用QDrag::exe()Qt拥有对拖动对象的所有权,并会在必要时将其删除
2.结束拖放:当用户放下拖动或取消拖动操作时结束拖放
3.MIME类型使用QMimeData类来描述。MIME类型通常由剪贴板和拖放系统使用,以识别不同类型的数据
拖放事件
1.QDragEnterEvent:拖动进入事件。当拖动操作进入部件时,发送该事件
2.QDragMoveEvnet:拖动移动事件。当拖动操作正在进行时,发送该事件
3.QDropEvent:放下事件。在完成拖放操作时发送该事件,即当用户在部件上放下一个对象时,发送此事件
4.QDragLeaveEvent:当拖放操作离开部件时发送该事件
方法
setAcceptDrops(true); //设置能否拖动
setDragEnabled(true); //设置能否放置
setDropIndicatorShown(false);//显示拖放指示器
setDropAction(Qt::MoveAction) //设置拖动动作
QDrag::exe(Qt::MoveAction | Qt::CopyAction); //可能的拖放动作(移动、复制)
使用步骤
1)、调用setAcceptDrops()、setDragEnabled()函数以使该部件能接受拖放事件。
2)、启动拖放:通常在mousePressEvent()或mouseMoveEvent()函数中启动拖放,记住启动拖放就是调用QDrag对象的exec()函数,在此步把需要拖动的数据保存在QMimeData对象中。
3)、重新实现需要接受放下数据的部件的dragEnterEvent()事件处理函数。
4)、根据需要重新实现dragMoveEvent或dropEvent()函数
示例:
public:
void dragEnterEvent(QDragEnterEvent* event) override;
void dropEvent(QDropEvent *event) override;
void mousePressEvent(QMouseEvent *event) override;
void mouseMoveEvent(QMouseEvent *event) override;
private:
QPoint m_startPos;
//设置能否拖动
setAcceptDrops(true);
定义:
void Widget::dragEnterEvent(QDragEnterEvent* event)
{
if (event->mimeData()->hasText()) {
event->acceptProposedAction();
}
}
void Widget::dropEvent(QDropEvent *event)
{
if (event->mimeData()->hasUrls()) {
QList<QUrl> urls = event->mimeData()->urls();
if(urls.isEmpty()) {
return;
}
qDebug()<<urls.first().toLocalFile();
}
if (event->mimeData()->hasText()) {
qDebug()<<event->mimeData()->text();
}
}
void Widget::mousePressEvent(QMouseEvent *event)
{
if (event->buttons() & Qt::LeftButton)
{
m_startPos = event->pos();
}
}
void Widget::mouseMoveEvent(QMouseEvent *event)
{
if (event->buttons() & Qt::LeftButton)
{
if ((event->pos() - m_startPos).manhattanLength() >= QApplication::startDragDistance())
{
QDrag *drag = new QDrag(this);
QMimeData *data = new QMimeData();
data->setText("text");
drag->setMimeData(data);
drag->setPixmap(QPixmap("close.png"));
drag->setHotSpot(event->pos() - m_startPos + QPoint(10,10)); // 拖动时鼠标指针的位置不变
Qt::DropAction result = drag->exec(Qt::CopyAction | Qt::MoveAction);
}
}
}