Qt官方案例知识点总结(拖放操作——Drag And Drop Robot )

--------------------------------------------------------------------------------------------------------------------------------

QPixmap轮廓剪裁 

 去掉Pixmap的外围部分,如下:

QPixmap pixmap("./img");
//调用createHeuristicMask(),再调用setMask
pixmap.setMask(pixmap.createHeuristicMask());

效果对比:

 ——》

可以看到以图像内轮廓为边界线,无关的白色区域被抹去了

---------------------------------------------------------------------------------------------------------------------------------

QGraphicsItem中开启拖动QDrag

重写QGraphicsItem的鼠标移动事件,在移动事件中开启拖动

void ColorItem::mouseMoveEvent(QGraphicsSceneMouseEvent * event) {//判断拖动距离,使用qt推荐的距离QApplication::startDragDistance()if (QLineF(event -> screenPos(), event -> buttonDownScreenPos(Qt::LeftButton)).length() < QApplication::startDragDistance()) {return;}//创建拖动对象QDrag * drag = new QDrag(event -> widget());//创建数据对象,并设置给本次拖动,这样本次拖动就有数据了QMimeData * mime = new QMimeData;drag -> setMimeData(mime);QImage image(":/images/head.png");mime -> setImageData(image);//可以设置图像数据mime -> setColorData(color);//颜色数据mime -> setText(QString("#%1%2%3").arg(color.red(), 2, 16, QLatin1Char('0')).arg(color.green(), 2, 16, QLatin1Char('0')).arg(color.blue(), 2, 16, QLatin1Char('0')));//字符串数据QPixmap pixmap(34, 34);pixmap.fill(Qt::white);drag -> setPixmap(pixmap);//设置拖动过程中在鼠标处显示的图片drag->setHotSpot(QPoint(15, 20));//设置鼠标在图片里的位置偏移drag -> exec();//开启本次拖动
}

qt推荐的拖动距离阈值:QApplication::startDragDistance() ,超过这个距离才启用拖动

创建的拖动对象(QDrag * drag)可以指定父对象也可以不指定,他会在这次拖动结束时自动释放,无论这次拖动有没有被drop接收 

创建的数据对象QMimeData在设置给拖动对象后也不用管他的释放(drag -> setMimeData(mime);),会跟着拖动对象一起释放

同时还可以设置鼠标在拖动的过程下面跟随着图片drag -> setPixmap(pixmap)

拖动执行函数

Qt::DropAction QDrag::exec(Qt::DropActions supportedActions = Qt::MoveAction)
Qt::DropAction QDrag::exec(Qt::DropActions supportedActions, Qt::DropAction defaultDropAction)

常用的行为就是复制、移动、空操作 

这是一个阻塞函数,

拖动结束后可以获取到返回值, 来获取到本次拖动最终执行了什么行为

supportedActions可以指定本次拖动支持的行为

defaultDropAction可以指定本次拖动默认的行为

---------------------------------------------------------------------------------------------------------------------------------

QMimeData携带自定义数据

其中QMimeData可以设置自定义的数据,需要继承重写或者调用setData方法  

  • 使用setData方法

他的第一个参数是一个字符串,指定数据的类型,可以自己定义

二个参数QByteArray,即要传输的数据

比如数据是1个结构体

结构体需要提供转成QByteArray的方法从QByteArray转到结构体的方法

// 自定义数据结构
struct Person {QString name;int age;// 序列化到 QByteArrayQByteArray serialize() const {QByteArray data;QDataStream stream(&data, QIODevice::WriteOnly);stream << name << age;return data;}// 从 QByteArray 反序列化static Person deserialize(const QByteArray &data) {QDataStream stream(data);QString name;int age;stream >> name >> age;return {name, age};}
};

创建自定义数据 ,指定类型的字符串可以自己随便写

// 创建自定义数据
Person person{"Alice", 30};// 序列化并设置到 QMimeData
QMimeData *mimeData = new QMimeData;
mimeData->setData("application/x-custom-person", person.serialize());

接收方解析自定义数据

// 获取 QMimeData(例如从拖放事件)
const QMimeData *mimeData = event->mimeData();// 检查是否存在自定义数据
if (mimeData->hasFormat("application/x-custom-person")) {// 提取数据并反序列化QByteArray data = mimeData->data("application/x-custom-person");Person person = Person::deserialize(data);qDebug() << "Received person:" << person.name << person.age;
}
  • 最小子类化QMimeData

即不重写相关虚函数,直接将数据作为其子类的成员变量,如下

比如把Person传出去

//自定义数据
struct Person{QString name="11"  ;int age=15;
};//子类化QMimeData,将自定义的类型作为其成员变量
class PersonMimeData: public QMimeData
{
public:Person person;//...还可以携带N多数据成员
};

创建自定义的MimeData

//创建自定义的MimeData,并初始化里面自定义的数据,然后设置给QDrag对象
QDrag * drag = new QDrag(event -> widget());
PersonMimeData * mime = new PersonMimeData;
mime -> person = {"May", 18};
drag -> setMimeData(mime);

接受方解析收到的数据

//从事件中获取mimedata(例如拖放事件),并强转成对应的类型
PersonMimeData * data = (PersonMimeData * ) event -> mimeData();
//取出内部携带的数据
qDebug() << data -> person.name << "   " << data -> person.age;

---------------------------------------------------------------------------------------------------------------------------------

QGraphicsItem中的drop拖放

  • 需要QGraphicsItem接受拖放
setAcceptDrops(true);
  • 需要重写dragEnterEvent事件,拖动进入事件

可对拖动携带数据做一些判断,判断是否有想要的数据

需要接受拖动,则需要显示的调用 event->setAccepted(true),否则后面的拖放事件会收不到数据

void CustomItem::dragEnterEvent(QGraphicsSceneDragDropEvent * event) {//可以对拖过来的数据进行一些判断,有没有想要的数据if (event -> mimeData() -> hasColor()) {event -> setAccepted(true); //然后要接受这次拖放,否则后面drop事件无法收到拖放//同时可以改变下item的样式,isDragging = true; //自己定义的标志变量,标记拖动进入了update();} else {event -> setAccepted(false); //否则拒绝这次拖放}
}
  • 需要重写拖放事件

主要就是获取本次拖放的mimeData

设置本次拖放最后采用的行为

void CustomItem::dropEvent(QGraphicsSceneDragDropEvent *event)
{isDragging = false;update();auto data=event->mimeData();//取mimeData里的数据//data->text();...event->setDropAction(Qt::CopyAction);//还可以设置本次拖放最后使用的行为,QDrag的exec函数的返回值就会变成这里设置的
}
  • 需要重写拖动离开事件

主要就是设置标记变量,表示拖动离开了

同时刷新下样式

void CustomItem::dragLeaveEvent(QGraphicsSceneDragDropEvent * event) {Q_UNUSED(event);isDragging = false;update();
}

---------------------------------------------------------------------------------------------------------------------------------

并行动画组QParallelAnimationGroup

可以在动画组里添加多个动画,这些动画可以同时进行

QParallelAnimationGroup * animation = new QParallelAnimationGroup(this);QPropertyAnimation * a1 = new QPropertyAnimation(target1, "rotation");
a1 -> setStartValue(5);
a1 -> setEndValue(-20);
animation -> addAnimation(a1);QPropertyAnimation * a2 = new QPropertyAnimation(target2, "rotation");
a2 -> setStartValue(15);
a2 -> setEndValue(-30);
animation -> addAnimation(a2);
//.....可以添加多个动画,这些动画可以同时执行animation -> setLoopCount(-1); //无限循环
animation -> start(); //并行动画组开启,多个动画同时运行

其中animation -> setLoopCount(-1); 参数设置为-1,可让动画无限循环

---------------------------------------------------------------------------------------------------------------------------------

正弦动画曲线

动画曲线类型QEasingCurve::SineCurve,正弦曲线

可以使动画1个执行周期内产生一来一回的效果,来和回是完全相反的两个动画,如下

其他曲线没有来回的效果

比如QEasingCurve::OutQuad,如下

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/77884.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【LLM】MOE混合专家大模型综述(重要模块原理)

note 当前的 MoE 架构就是一个用显存换训练时长/推理延迟的架构MoE 目前的架构基本集中在于将原先 GPT 每层的 FFN 复制多份作为 n 个 expert&#xff0c;并增加一个 router&#xff0c;用来计算每个 token 对应到哪个 FFN&#xff08;一般采用每个 token 固定指派 n 个 exper…

电子病历高质量语料库构建方法与架构项目(临床情景理解模块篇)

引言 随着人工智能技术在医疗健康领域的广泛应用,电子病历(Electronic Medical Records,EMR)作为临床医疗数据的重要载体,已成为医学研究和临床决策支持的关键资源。电子病历高质量语料库的构建为医疗人工智能模型的训练和应用提供了基础支撑,其中临床情境理解模块是连接…

大连理工大学选修课——机器学习笔记(1):概述

机器学习概述 机器学习的本质 机器学习是为了设计解决问题的算法。 为输入与输出建立某种映射&#xff1a; 类似于函数关系&#xff1a; Y f ( X ) Yf(X) Yf(X) 不同的映射方法体现了不同的思想。 相关概念 深度学习是机器学习的一个分支 深度学习是深层次化的神经网…

远程 Debugger 多用户环境下的用户隔离实践

远程 Debugger 多用户环境下的用户隔离实践 在现代分布式开发和云原生环境下&#xff0c;远程 Debugger 的应用愈发普遍。然而&#xff0c;随着多人协作和多租户场景的出现&#xff0c;**远程 Debugger 的“用户隔离”**变得至关重要。只有实现了良好的用户隔离&#xff0c;才…

毕业论文 | 基于C#开发的NMEA 0183协议上位机

以下是基于C#开发的NMEA 0183协议上位机完整实现方案,包含串口通信、数据解析与可视化功能: 基于C#开发的NMEA 0183协议上位机 一、项目结构二、核心代码实现1. 数据模型定义2. 串口通信管理3. NMEA协议解析核心4. 主界面实现(Windows Forms)三、界面设计关键元素(需在窗体…

Qt -DFS可视化

博客主页&#xff1a;【夜泉_ly】 本文专栏&#xff1a;【暂无】 欢迎点赞&#x1f44d;收藏⭐关注❤️ 目录 前言关于如何sleep实现思路Pixmapspixmaps.hpixmaps.cpp MapSquaremapsquare.hmapsquare.cpp dfsthreaddfsthread.hdfsthread.cpprun dfs其他 WidgetUnit其他 Qt -DFS…

RHCSA Linux 系统 文件系统权限

1. 文件的一般权限 &#xff08;1&#xff09;文件权限标识解读 drwxr - xr - x. 12 root root 144 Feb 17 16:51 usr ➤d&#xff1a;文件类型&#xff08;d 表示目录&#xff09; ➤rwx&#xff1a;文件所有者权限&#xff08;读 r&#xff0c;写 w&#xff0c;执行 x&am…

华为云IoT平台与MicroPython实战:从MQTT协议到物联网设备开发

目录 前言 1. 华为云 1.1. 创建实例 1.2. 创建产品 1.3. 编辑服务模型 1.4. 注册设备 1.4.1. 复制设备连接参数 1.5. 连接参考代码 2. micropython版-物联网 2.1. 环境搭建 2.2. 实现步骤 2.3. 示例代码 结语 前言 物联网&#xff08;IoT&#xff09;技术的快速发…

2025-04-30 AIGC-如何做短片视频

摘要: 2025-04-30 AIGC-如何做短片视频 如何做短片视频: 一、画图修图 1.保存视频&#xff08;无水保存&#xff09; 2.文案提取&#xff08;提取文案&#xff09; 3. DeepSeek(提示词&#xff09; 4.小梦Ai&#xff08;图片视频&#xff09; 5.修图Ai 6.扩图Ai 7.养生…

硬件工程师面试常见问题(10)

第四十六问&#xff1a;锁存器&#xff0c;触发器&#xff0c;寄存器三者的区别 触发器&#xff1a;能够存储一位二值信号的基本单元电路统称为 "触发器"。&#xff08;单位&#xff09; 锁存器&#xff1a;一位触发器只能传送或存储一位数据&#xff0c;而在实际工…

外部访问 Kubernetes 集群中 MQ 服务的方案

外部访问 Kubernetes 集群中 MQ 服务的方案 当您在 Kubernetes 集群中部署了消息队列服务&#xff08;如 RabbitMQ、Kafka、ActiveMQ 等&#xff09;后&#xff0c;以下是外部客户端访问这些服务的几种可靠方法&#xff1a; 一、基础访问方案 1. NodePort 方式暴露服务 # M…

论文笔记(八十二)Transformers without Normalization

Transformers without Normalization 文章概括Abstract1 引言2 背景&#xff1a;归一化层3 归一化层做什么&#xff1f;4 动态 Tanh &#xff08;Dynamic Tanh (DyT)&#xff09;5 实验6 分析6.1 DyT \text{DyT} DyT 的效率6.2 tanh \text{tanh} tanh 和 α α α 的消融实验…

软考中级-软件设计师 操作系统(手写笔记)

第一章&#xff1a;基础知识 第二章&#xff1a;进程管理 状态转换图 进程同步机制 信号量机制 信号量题 死锁 第三章&#xff1a;存储管理 基础知识 分页存储管理 分段存储管理 段页式存储管理 页面置换算法 第四章&#xff1a;文件管理 基础知识 索引分配 空闲存储空间的管…

ubuntu 部署moodle

通过地址https://download.moodle.org/releases/latest/选择下载&#xff0c;下载两种压缩包都特别慢&#xff08;有可能无法下载&#xff09;。 可以使用下面git下载项目 注意图中php、mysql等版本要求&#xff0c;本次采用Ubuntu22.04下 nginxphp8.2mysql8.4部署 mkdir /var…

python实战项目67:空气质量在线检测平台js逆向

python实战项目67:空气质量在线检测平台js逆向 一、需求介绍二、完整代码一、需求介绍 项目需求是获取某个城市(以北京市为例)历年(2013年12月至2025年4月)的空气质量数据,字段包括日期、AQI、质量等级、PM2.5、PM10、NO2、CO、SO2等。改网站的网址是“https://www.aqis…

【Linux】记录一个有用PS1

PS1 是用来定义shell提示符的环境变量 下面是一个带有颜色和丰富信息的 Linux PS1 配置示例&#xff0c;包含用户名、主机名、路径、时间、Git 分支和退出状态提示&#xff1a; # 添加到 ~/.bashrc 文件末尾 PS1\[\e[1;32m\]\u\[\e[m\] # 绿色粗体用户名 PS…

Python PyTorch库【机器学习框架】全面深入讲解与实践

一、PyTorch 核心概念 1. 定义与发展背景 PyTorch 是由 Facebook AI Research (FAIR) 开发的开源机器学习框架&#xff0c;2016 年首次发布。其核心特性包括&#xff1a; 动态计算图&#xff08;Define-by-Run&#xff09;GPU 加速张量计算自动微分系统丰富的神经网络模块 …

呼叫中心座席管理系统:智能升级,高效服务

在数字化转型加速的今天&#xff0c;客户服务体验已成为企业竞争力的核心要素。传统 呼叫中心系统 依赖硬件设备、人工操作的模式已无法满足高效、智能、灵活的现代企业需求。畅信达呼叫中心 座席管理系统 V5.0应运而生&#xff0c;以WEBRTC软电话接入、智能座席辅助、知识库管…

时态--00--总述

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 时态句子结构时态标志词 时态 句子结构 时态标志词

算法每日一题 | 入门-顺序结构-字母转换

字母转换 题目描述 输入一个小写字母&#xff0c;输出其对应的大写字母。例如输入 q[回车] 时&#xff0c;会输出 Q。 输入格式 无 输出格式 无 输入输出样例 #1 输入 #1 q输出 #1 QC 首先我们要知道&#xff0c;C字符的所有转换形式都是依照ASCII码来的。 所以&…