Qt 拖放操作QDrag

介绍

拖放的启动和结束

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);

        }
    }
}
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值