1、接受拖放


Drag & Drop 是一个界面操作,用于在两个窗口间传递数据。


Drag Source: 拖放源窗口

Drag Target: 拖放目标窗口


拖放操作:

1、在源窗口:选中目标,按下鼠标,移动,拖至目标窗口(Drag)

2、在目标窗口:取消鼠标,到指定位置,松开鼠标(Drop)

(按下ESC取消操作)



MIME:

MIME(Multipurpose Internet Mail Extensions)被传递的数据以MIME格式传送,它是多组type-data数据:(type0, data0) (type1, data1) (type2, data2) ... (type-n, data-n)

其中,

type:字符串,用于指定数据类型,如:“text/plain”

data:字节数组,即要传递的数据



接受拖放的步骤:

//接受拖放setAcceptDrops(true);//重写voiddragEnterEvent(QDragEnterEvent*event);voiddragLeaveEvent(QDragLeaveEvent*event);voiddragMoveEvent(QDragMoveEvent*event);voiddropEvent(QDropEvent*event);


小练习:

实现一个简单的窗体,当文本被拖入该窗体时,窗体内的label控件会显示拖入的文本内容

代码:

#include<QDragEnterEvent>#include<QDragLeaveEvent>#include<QDragMoveEvent>#include<QDropEvent>#include<QMimeData>#include"Test13_1a_12_18.h"Test13_1a_12_18::Test13_1a_12_18(QWidget*parent):QMainWindow(parent){ui.setupUi(this);setAcceptDrops(true);//设置:接受拖放}//进入voidTest13_1a_12_18::dragEnterEvent(QDragEnterEvent*event){if(event->mimeData()->hasFormat("text/plain")){event->acceptProposedAction();}}//松开鼠标voidTest13_1a_12_18::dropEvent(QDropEvent*event){if(event->mimeData()->hasFormat("text/plain")){QStringtext=event->mimeData()->text();ui.label->setText(text);}}


二、发起拖放

在QWidget窗口中发起一个Drag操作 步骤:

1、鼠标按下

2、鼠标移动,当移动一段距离后,认为是一个拖动操作。可以发起一个drag动作


实现方法:

1、派生一个子类

2、重写函数:

virtualvoidmouseMoveEvent(QMouseEvent*event);virtualvoidmousePressEvent(QMouseEvent*event);


同时传送多种MIME数据:

mimeData->setHtml("xxxxxxx");mimeData->setText(text);mimeData->("123,"dat);//自定义格式的数据//data:QByteArray

voidMyListWidget::mousePressEvent(QMouseEvent*event){//记下起点m_dragPosition=event->pos();m_dragItem=this->itemAt(m_dragPosition);//记得调用父类的函数(保持原有的按键行为)QListWidget::mouseMoveEvent(event);}voidMyListWidget::mouseMoveEvent(QMouseEvent*event){//只允许用左键拖动if(!(event->buttons()&Qt::LeftButton)){return;}//移动一定距离后,才算是开始拖动if((event->pos()-m_dragPosition).manhattanLength()<QApplication::startDragDistance()){return;}//找到拖动的项if(!m_dragItem){return;}QStringtext=m_dragItem->text();//创建数据QDrag*drag=newQDrag(this);QMimeData*mimeData=newQMimeData;mimeData->setText(text);drag->setMimeData(mimeData);//启动拖放startadragQt::DropActionresult=drag->exec(Qt::CopyAction|Qt::MoveAction);//检查操作是否成功if(Qt::IgnoreAction!=result){}else{//按住Ctrl键:Qt::CopyAction//没按:Qt::RemoveAction}}