您的位置:首页 > 编程语言 > Qt开发

Qt控件拖拽事件

2011-06-24 00:21 459 查看

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

Qt控件拖拽事件

Byflyingpigon2010/06/06699Views|GotoComments(1)

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

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

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

viewsource

print?

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

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

viewsource

print?

01
void
DragedListWidget::startDrag(Qt::DropActionssupportedActions)
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来说明

viewsource

print?

01
void
OgreWidget::dragEnterEvent(QDragEnterEvent*event)
02
{
03
//先查看拖拽到场景内的物体是否是模型
04
const
QMimeData*data=event->mimeData();
05
QVarianttype=data->property(
"TYPE"
);
06
if
(!mKeyDown&&type==QVariant(
"MODELS"
))
07
{
08
QVarianttype=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();则均不触发.

Relatedposts

毕业设计

TankWarV0.1Published

Qt中文乱码解决方案

TankWar

TankWar系列(一)基本框架

TankWar0.2.1

OISCEGUI更改窗口大小解决办法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: