温馨提示×

温馨提示×

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

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

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

发布时间:2020-07-29 02:38:13 来源:网络 阅读:4998 作者:shangluyi 栏目:编程语言

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


向AI问一下细节

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

AI