首页 > 代码库 > 【Qt学习笔记】13.拖放技术:Drag & Drop

【Qt学习笔记】13.拖放技术:Drag & Drop

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

// 重写
void dragEnterEvent( QDragEnterEvent* event );
void dragLeaveEvent( QDragLeaveEvent* event );
void dragMoveEvent( QDragMoveEvent* event );
void dropEvent( 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);		//设置:接受拖放
}

// 进入
void Test13_1a_12_18::dragEnterEvent(QDragEnterEvent *event)
{
	if ( event->mimeData()->hasFormat("text/plain") )
	{
		event->acceptProposedAction();
	}	
}

//松开鼠标
void Test13_1a_12_18::dropEvent(QDropEvent *event)
{
	if (event->mimeData()->hasFormat("text/plain"))
	{
		QString text = event->mimeData()->text();
		ui.label->setText(text);
	}
}


二、发起拖放

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

1、鼠标按下

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


实现方法:

1、派生一个子类

2、重写函数:

virtual void mouseMoveEvent( QMouseEvent* event );
virtual void mousePressEvent( QMouseEvent* event );


同时传送多种MIME数据:

mimeData->setHtml( "xxxxxxx" );
mimeData->setText( text );
mimeData->("123," dat);     //自定义格式的数据
//data : QByteArray
void MyListWidget::mousePressEvent(QMouseEvent *event)
{
	// 记下起点
	m_dragPosition = event->pos();
	m_dragItem = this->itemAt(m_dragPosition);

	// 记得调用父类的函数(保持原有的按键行为)
	QListWidget::mouseMoveEvent(event);
}

void MyListWidget::mouseMoveEvent(QMouseEvent *event)
{
	// 只允许用左键拖动
	if ( !(event->buttons() & Qt::LeftButton) )
	{
		return;
	}

	// 移动一定距离后,才算是开始拖动
	if ((event->pos() - m_dragPosition).manhattanLength() < QApplication::startDragDistance())
	{
		return;
	}

	// 找到拖动的项
	if (!m_dragItem)
	{
		return;
	}
	QString text = m_dragItem->text();

	// 创建数据
	QDrag* drag = new QDrag(this);
	QMimeData* mimeData = new QMimeData;
	mimeData->setText(text);
	drag->setMimeData(mimeData);

	// 启动拖放 start a drag 
	Qt::DropAction result = drag->exec(Qt::CopyAction | Qt::MoveAction);

	// 检查操作是否成功
	if (Qt::IgnoreAction != result)
	{

	}
	else
	{
		// 按住Ctrl键: Qt::CopyAction
		// 没按: Qt::RemoveAction
	}
}


【Qt学习笔记】13.拖放技术:Drag & Drop