QDrag 使用一例

6 篇文章 0 订阅
本文介绍了如何在Qt环境中利用QDrag进行拖放操作。通过重载QGraphicsItem的mousePressEvent开始拖动,并通过dropEvent接收拖拽元素,同时详细说明了mimeData在拖放过程中传递数据的作用。确保QGraphicsItem设置acceptDrop为true以触发DropEvent,从而实现自定义的拖放功能。
摘要由CSDN通过智能技术生成

        在Qt中可以使用QDrag 来拖动操作Graphics各个元素,以此实现方便的拖动操作。

我们可以从QGraphicsItem 重载 mousePressEvent 来做开始拖动的操作,比如

void Item::mousePressEvent(QGraphicsSceneMouseEvent *event){
    Qt::MouseButtons btn = event->buttons();
    if(btn == Qt::LeftButton){

        QDrag* drag = new QDrag(this->scene());

        QMimeData* data = new QMimeData();
        drag->setMimeData(data);

        QPixmap pixmap(":image.png"); 
        QPainter painter(&pixmap);

        drag->setPixmap(pixmap); //这里设置拖拽时跟随鼠标的图片
        drag->setHotSpot(QPoint(15,15)); //设置跟随图片的中心点

        drag->exec();   //开始拖拽, 释放拖拽执行下面代码
        #ifdef Q_WS_WIN     //linux系统中你不能删除drag,删除会由系统自动执行(自己调试得知,可能不正确)
             delete drag;//注意 上面QMimeData* data这里也会一并删除
         #endif
  }
}

 这样当我们鼠标按下这个Item时候 拖动就可以开始了

我们有了可以拖的,还必须有去接收这个拖拽的东西,因为只有定义了允许放东西的地方。你才能把东西放里面

于是我们重载另一QGraphicsItem 的dropEvent函数

void DragReceiverItem::dropEvent(QGraphicsSceneDragDropEvent *event)
{
    
    qDebug() << "drop event " ;
    qDebug() << "pos =  " << event->pos();
    qDebug() << "scene pos = " << event->scenePos();
    qDebug() << "screen pos = " << event->screenPos();
    qDebug() << "mime data = " << event->mimeData();
    
}

 可以看到 mimeData也会随着 QGraphicsSceneDragDropEvent传递过来,这样拖拽就可以传递一些我们自己的数据。

还有一点要注意,就是QGraphicsItem必须设置 accpetDrop 为true之后才能触发DropEvent等事件

然后我们还有很多地方可以定制,比如

void DragReceiverItem::dragEnterEvent(QGraphicsSceneDragDropEvent *event)
{
    qDebug() << "拖到 当前Item里面时";
}

void DragReceiverItem::dragLeaveEvent(QGraphicsSceneDragDropEvent *event)
{
    qDebug() << "拖到当前item外面时";
}

void DragReceiverItem::dragMoveEvent(QGraphicsSceneDragDropEvent *event)
{
    qDebug() << "拖到当前item里面的移动时";
}
 

综上,我们拖拽操作的拖动方与接收方都定义好了,我们就可以方便的在Qt Graphics中使用拖拽操作了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值