Qt控件拖拽事件

http://yamcot.com/qt-drag-drop-event.html

Qt控件拖拽事件

    因为编辑器需要在不同的控件之间支持拖拽操作,所以对Qt的拖拽研究了一下.

    这里实现一种比较简单的拖拽方案

1.拖拽方控件
    拖拽需要支持拖拽的控件开启拖拽功能,调用函数

1setDragEnabled(true);
2setDragDropMode(QAbstractItemView::DragOnly);

    其中拖拽模式可查具体的API, 这里设置此空间之支持向外拖拽功能(即只能从此控件向别的控件拖拽操作,而不支持别的控件向此控件拖拽)

    然后需要复写startDrag(Qt::DropActions supportedActions)函数来执行开始拖拽时的一些操作.

01void DragedListWidget::startDrag(Qt::DropActions supportedActions)
02{
03  QListWidgetItem *item = currentItem();
04  
05  QMimeData *mimeData = new QMimeData;
06  mimeData->setText(currentItem()->text());
07  // 设置拖拽物体为模型
08  mimeData->setProperty("TYPE", QVariant("MODELS"));
09  mimeData->setProperty("MODEL_TYPE", QVariant(mType.c_str()));
10  
11  QDrag *drag = new QDrag(this);
12  drag->setMimeData(mimeData);
13  drag->exec(Qt::MoveAction);
14}

 

 

    这里QListWidget支持向外拖拽的功能,其中QMimeData用来再拖拽控件和接受拖拽控件间传输数据,这里我把QListWidgetItem的文本内容作为传输内容发送.并设置了一些限定的属性操作setProperty(这样接受拖拽的控件就可以只接受此控件拖拽来的内容了)构造QDrag对象,并执行拖拽操作.

2.接受拖拽方控件

有几个函数需要复写.
//当拖拽后进入接收拖拽的控件时触发
1.dragEnterEvent(QDragEnterEvent *event) 
//当拖拽(没有释放鼠标时)离开接收拖拽的控件时触发
2.dragLeaveEvent(QDragLeaveEvent *event)
//拖拽状态下在接收拖拽的控件内移动鼠标时触发
3.dragMoveEvent(QDragMoveEvent *event)
//拖拽状态下释放鼠标时触发
4.dropEvent(QDropEvent *event)

这里主要针对dragEnterEvent来说明

01void OgreWidget::dragEnterEvent(QDragEnterEvent *event)
02{
03  // 先查看拖拽到场景内的物体是否是模型
04  const QMimeData *data = event->mimeData();
05  QVariant type = data->property("TYPE");
06  if (!mKeyDown && type == QVariant("MODELS"))
07  {
08    QVariant type = data->property("MODEL_TYPE");
09                //......
10    event->accept();
11  }
12  else
13    event->ignore();
14}

    首先从传入的QDragEnterEvent 获取接收到的QMimiData,之后判断这次拖拽是否是需要的拖拽操作, 如果是则event->accept();表明接收此次拖拽事件, 如果不是则调用event->ignore(); 丢弃此次拖拽操作.
    只有调用event->accept();之后dragLeaveEvent(QDragLeaveEvent *event), dragMoveEvent(QDragMoveEvent *event), dropEvent(QDropEvent *event)才会在之后触发, 如果是event->ignore(); 则均不触发.

 

 


Related posts


  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值