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

发布时间:2020-07-29 02:38:13 作者:shangluyi
来源:网络 阅读:4922

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控件会显示拖入的文本内容

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

代码:

#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
	}
}


推荐阅读:
  1. C++中的类成员函数如何使用function与bind进行绑定
  2. gflags命令行解析包如何在C++中使用

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c++ gui qt

上一篇:12C 利用global_name进行针对性导入导出

下一篇:系统内存耗尽的案例分析

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》