【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

时间: 2024-12-26 13:49:53

【Qt学习笔记】13.拖放技术:Drag & Drop的相关文章

mybatis学习笔记(13)-查询缓存之二级缓存

mybatis学习笔记(13)-查询缓存之二级缓存 mybatis学习笔记13-查询缓存之二级缓存 二级缓存原理 开启二级缓存 调用pojo类实现序列化接口 测试方法 useCache配置 刷新缓存就是清空缓存 应用场景和局限性 本文主要讲mybatis的二级缓存,二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的. 二级缓存原理 首先开启mybatis的二级缓存. sqlS

qt学习笔记(五) QGraphicsPixmapItem与QGraphicsScene的编程实例 图标拖动渐变效果

应大家的要求,还是把完整的project文件贴出来,大家省点事:http://www.kuaipan.cn/file/id_48923272389086450.htm 先看看执行效果,我用的群创7寸屏,主机是mini2440,分辨率是800*480,程序写比較粗糙,但对刚開始学习的人还是有一点启示,大家一起进步. qt中提供了QGphicsView,QGraphicsScene,QGraphicsItem,QGraphicsPixmapItem是QGraphicsItem的子类 分辨创建它们的实

HTML&CSS基础学习笔记13—无序列表

无序列表 有时我们的工作繁忙,杂事很多,怕忘记,就会把事情一件件列出来,防止忘记. 它们的排列顺序对于我们来说并不重要,可以随意调换,我们将它称为无序列表,HTML里用<ul>标签来表示无序列表,列表里的项目则用<li>标签来表示: 1 2 3 4 5 <ul>     <li></li>     <li></li>     ... </ul> 看一段实例代码: 对于的浏览器显示结果是这样的: 更多内容学习,请

QT学习笔记—1

1.模态和非模态的区别:非模态可以同时操作两个窗口,模态的只能在顶层窗口关闭之后才能使用其他窗口 //同时显示出widget和dialog窗口,非模态     QDialog *dialog = new QDialog(this);     dialog->show(); //同时显示出widget和dialog窗口,模态     QDialog *dialog = new QDialog(this);     dialog->setModal(true);     dialog->sh

python 学习笔记 13 -- 常用的时间模块之time

Python 没有包含对应日期和时间的内置类型,不过提供了3个相应的模块,可以采用多种表示管理日期和时间值: *    time 模块由底层C库提供与时间相关的函数.它包含一些函数用于获取时钟时间和处理器的运行时间,还提供了基本解析和字符串格式化工具 *    datetime 模块为日期.时间以及日期时间值提供一个更高层接口.datetime 中的类支持算术.比较和时区配置. *    calendar 模块可以创建周.月和年的格式化表示.它还可以用来计算重复事件.给定日期是星期几,以及其他基

Qt学习笔记-Widget布局管理

Qt学习笔记4-Widget布局管理 以<C++ GUI Programming with Qt 4, Second Edition>为参考 实例:查找对话框 包含三个文件,finddialog.h,finddialog.cpp及main.cpp. //finddialog.h代码 #ifndef FINDDIALOG_H#define FINDDIALOG_H #include <QDialog> class QCheckBox;class QLabel;class QLineE

Swift学习笔记(13)--属性 (Properties)

普通属性用var和let即可,本文不做详述 1.延迟存储属性 延迟存储属性是指当第一次被调用的时候才会计算其初始值的属性.在属性声明前使用@lazy来标示一个延迟存储属性. class DataImporter { /* DataImporter 是一个将外部文件中的数据导入的类. 这个类的初始化会消耗不少时间. */ var fileName = "data.txt" // 这是提供数据导入功能 } class DataManager { @lazy var importer = D

springmvc学习笔记(13)-springmvc注解开发之集合类型參数绑定

springmvc学习笔记(13)-springmvc注解开发之集合类型參数绑定 springmvc学习笔记13-springmvc注解开发之集合类型參数绑定 数组绑定 需求 表现层实现 list绑定 需求 表现层实现 map绑定 本文主要介绍注解开发的集合类型參数绑定,包含数组绑定,list绑定以及map绑定 数组绑定 需求 商品批量删除,用户在页面选择多个商品.批量删除. 表现层实现 关键:将页面选择(多选)的商品id,传到controller方法的形參,方法形參使用数组接收页面请求的多个商

Ext.Net学习笔记13:Ext.Net GridPanel Sorter用法

Ext.Net学习笔记13:Ext.Net GridPanel Sorter用法 这篇笔记将介绍如何使用Ext.Net GridPanel 中使用Sorter. 默认情况下,Ext.Net GridPanel中的列都具有排序功能,效果如下: 如果要禁用列排序,需要在列模型中添加一个属性Sortable="false" 客户端排序 排序是对Store的操作.如果我们要在一个Store中加入排序,可以使用下面的配置: <Sorters> <ext:DataSorter P