Qt区分鼠标按下时移动的是哪个多边形

  1. 使用不同的鼠标事件处理器:为每个多边形分配不同的事件处理器,或者在同一个处理器中使用逻辑来区分。

  2. 检查鼠标点击位置:在鼠标按下事件中,检查鼠标的位置是否在某个多边形的边上或顶点上。

  3. 使用图形的标识符:给每个多边形分配一个唯一的标识符,并在鼠标事件中使用这个标识符来识别多边形。

  4. 利用图形的属性:例如,可以使用图形的颜色、层级或其他属性作为区分依据。

    #include <QWidget>
    #include <QMouseEvent>
    #include <QPainter>
    #include <QVector>
    #include <QPointF>
    #include <QLineF>
    #include <cmath>class PolyWidget : public QWidget {Q_OBJECTpublic:PolyWidget(QWidget *parent = nullptr) : QWidget(parent) {// 初始化两个多边形polygon1 << QPointF(50, 50) << QPointF(150, 50) << QPointF(100, 150);polygon2 << QPointF(200, 100) << QPointF(300, 100) << QPointF(250, 200);}protected:void paintEvent(QPaintEvent *event) override {QPainter painter(this);painter.setPen(QPen(Qt::black, 2));// 绘制第一个多边形drawPolygon(painter, polygon1, 1);// 绘制第二个多边形drawPolygon(painter, polygon2, 2);}void mousePressEvent(QMouseEvent *event) override {if (event->button() == Qt::LeftButton) {if (isInsidePolygon(polygon1, event->pos())) {selectedPolygon = 1;} else if (isInsidePolygon(polygon2, event->pos())) {selectedPolygon = 2;}}}void mouseMoveEvent(QMouseEvent *event) override {if (selectedPolygon == 1 && event->buttons() & Qt::LeftButton) {movePolygon(polygon1, event->pos());} else if (selectedPolygon == 2 && event->buttons() & Qt::LeftButton) {movePolygon(polygon2, event->pos());}update();}void mouseReleaseEvent(QMouseEvent *event) override {selectedPolygon = 0; // 重置选中的多边形}private:QVector<QPointF> polygon1;QVector<QPointF> polygon2;int selectedPolygon = 0; // 0 表示没有多边形被选中void drawPolygon(QPainter &painter, const QVector<QPointF> &polygon, int id) {for (int i = 0; i < polygon.size() - 1; ++i) {painter.drawLine(polygon[i], polygon[i + 1]);}painter.drawLine(polygon.last(), polygon.first()); // 闭合多边形// 可以在这里添加更多与 id 相关的绘制逻辑}bool isInsidePolygon(const QVector<QPointF> &polygon, const QPointF &pos) {// 这里实现检测点是否在多边形内部的逻辑// 可以使用射线法或多边形的边界框来优化检测// 以下代码仅为示例,实际检测逻辑可能更复杂for (int i = 0; i < polygon.size() - 1; ++i) {QLineF line(polygon[i], polygon[i + 1]);if (line.intersects(QLineF(pos, pos + QPointF(1, 0)))) {return true;}}return false;}void movePolygon(QVector<QPointF> &polygon, const QPointF &newPos) {if (selectedPolygon) {QPointF delta = newPos - polygon.first();for (QPointF &point : polygon) {point += delta;}}}
    };#include "PolyWidget.moc" // 确保包含moc文件

    在这个示例中,PolyWidget类包含两个多边形polygon1polygon2。我们重写了paintEvent来绘制这两个多边形,并重写了鼠标事件来处理拖动逻辑。

  5. mousePressEvent:当鼠标按下时,使用isInsidePolygon函数检查鼠标点击是否在任一个多边形的边上或顶点上,根据检测结果设置selectedPolygon
  6. mouseMoveEvent:当鼠标移动时,如果左键保持按下状态,并且selectedPolygon不为0,则调用movePolygon函数移动当前选中的多边形。
  7. mouseReleaseEvent:当鼠标左键释放时,重置selectedPolygon

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

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

相关文章

十五届蓝桥杯JAVA B组题目详解(持续更新中)

试题 B: 类斐波那契循环数 我发现蓝桥杯的题目现在就是要费时间去理解&#xff0c;所以还是审题很重要&#xff0c;这道题的思路就是&#xff0c;一个n位数的前n个数&#xff0c;都是对应的位数上的值&#xff0c;比如说12345&#xff0c;五位数是吧&#xff0c;那数列S的前五位…

phpstudy下载使用以及搭建本地SQL labs靶场

一&#xff0c;PHP study 小皮面板(phpstudy) - 让天下没有难配的服务器环境&#xff01; (xp.cn) 1&#xff0c;下载。 根据自己电脑系统下载对应的版本。 双击exe文件运行 选择下载目录&#xff08;路径不能有中文名&#xff09;。 2&#xff0c;使用。 启动阿帕奇和MySQ…

AI学习指南机器学习篇-自组织映射(Self-Organizing Maps,SOM)简介

AI学习指南机器学习篇-自组织映射&#xff08;Self-Organizing Maps&#xff0c;SOM&#xff09;简介 自组织映射&#xff08;Self-Organizing Maps&#xff0c;SOM&#xff09;是一种无监督学习算法&#xff0c;经常被用于降维、聚类和可视化高维数据。本篇博客将对SOM算法的…

数据库第二次作业

1.建立数据库 2.插入数据 3.完成查询 &#xff08;1&#xff09;、显示所有职工的基本信息。 &#xff08;2&#xff09;、查询所有职工所属部门的部门号&#xff0c;不显示重复的部门号。 &#xff08;3&#xff09;、求出所有职工的人数。 &#xff08;4&#xff09;、列…

FreeRTOS 信号量

信号量是操作系统中重要的一部分&#xff0c;信号量是任务间同步的一种机制&#xff0c;信号量可以用在多 任务访问同一资源时的资源管理。FreeRTOS 提供了多种信号量&#xff0c;按信号量的功能可分为二值信号量、计数型信号量、互斥信号量和递归互斥信号量。 使用信号量相关…

C#各种锁知识点

先上总结&#xff1a; 锁类型特点适用场景优点缺点自旋锁忙等待实现锁定&#xff0c;适合高并发短时间锁定高并发环境&#xff0c;短时间锁定&#xff0c;仅限单进程多线程同步开销低&#xff0c;避免线程上下文切换忙等待消耗CPU资源&#xff0c;不适合长时间锁定&#xff0…

组队学习——贝叶斯分类器

前言 本次数据继续沿用上一次主题的【组队学习——支持向量机-CSDN博客】 数据处理部分延续【组队学习——支持向量机】主题的处理办法对应划分训练集和验证集 模型选择 本次贝叶斯分类器模型的较多&#xff0c;常用的为高斯朴素贝叶斯分类器、多项式朴素贝叶斯分类器、伯努…

配置文件格式 XML 快速上手

文章目录 1.语法2.实例3.解析参考文献 XML&#xff08;Extensible Markup Language&#xff09;是可扩展标记语言&#xff0c;用来传输和存储数据。因为其允许用户自定义标记名称&#xff0c;具有自我描述性&#xff0c;可灵活地用于存储服务配置信息。 1.语法 XML 文档结构是…

JavaWeb总结

终于结束了JavaWeb的学习&#xff0c;个人感觉其实就是学习客户端与服务端交互的中间件&#xff0c;以及服务端处理的逻辑&#xff0c;来帮助我们构建整个项目的运转逻辑&#xff0c;从客户端到服务器再到客户端&#xff0c;核心是围绕着一系列的请求和响应如何处理&#xff0c…

嵌入式Linux学习: platform 设备驱动实验

在Linux中&#xff0c;Platform&#xff08;平台&#xff09;机制是一个重要的设备驱动管理框架&#xff0c;它主要在Linux 2.6内核及以后的版本中引入。Platform机制的主要目的是提供一种统一的方式来管理那些不直接挂靠在传统物理总线&#xff08;如USB、PCI、I2C、SPI等&…

信息学奥赛一本通 1270:【例9.14】混合背包

【题目描述】 一个旅行者有一个最多能装V公斤的背包&#xff0c;现在有n件物品&#xff0c;它们的重量分别是W1&#xff0c;W2&#xff0c;…,Wn &#xff0c;它们的价值分别为C1,C2,…,Cn。有的物品只可以取一次&#xff08;01背包&#xff09;&#xff0c;有的物品可以取无限…

如何理解ref toRef和toRefs

是什么 ref 生成值类型的响应式数据可用于模板和reactive通过.value修改值 ref也可以像vue2中的ref那样使用 toRef 针对一个响应式对象&#xff08;reactive&#xff09;的prop创建一个ref两者保持引用关系 toRefs 将响应式对象&#xff08;reactive封装&#xff09;转换…

论文阅读:Speculative RAG: Enhancing Retrieval Augmented Generation through Drafting

论文地址&#xff1a;https://arxiv.org/abs/2407.08223 RAG 将 LLM 的生成能力与外部知识源相结合&#xff0c;以提供更准确和最新的响应。最近的 RAG 进展侧重于通过迭代 LLM 完善或通过 LLM 的额外指令调整获得自我批判能力来改进检索结果。在这项工作中&#xff0c;作者介…

编程中的智慧六:单例、原型、建造者

上一篇咱们结合Spring介绍了设计模式中的工厂模式相关方法&#xff0c;其实现在Java开发基本上都是基于Spring框架开发&#xff0c;所以后续我们在开发过程中基本上很少自己重写一个工厂模式&#xff0c;都是直接使用Spring来完成。今天咱们接着看剩下的创建型设计模式&#xf…

Dubbo学习笔记

Dubbo 简介 Apache Dubbo是一款高性能的Java RPC框架。其前身是阿里巴巴公司开源的一个高性能、轻量级的开源Java RPC框架&#xff0c;可以和Spring框架无缝集成。 其中文官网:https://dubbo.gitbooks.io/dubbo-user-book/content/ 特性和用法 架构 节点角色说明 节点角色…

应用层的重点协议

目录 一、DNS 二、NAT 1、技术背景 2、NAT机制IP转化过程 三、NAPT NAT技术的缺陷 四、HTTP 1、协议格式 2、HTTP请求 1&#xff09;method(方法) GET请求的特点 POST请求的特点 GET和POST的区别 2&#xff09;URL(网址) 基本格式 关于URL encode 3&#xff0…

c++11:异常

目录 c异常与c传统处理错误的区别 c语言处理错误的方式 c处理错误的方式 异常的抛出和处理 demo 异常的重新抛出 demo 异常安全 noexcept 自定义异常体系 c舍弃了c语言处理错误的方式&#xff0c;引入了异常来处理错误。 c异常与c传统处理错误的区别 c语言处理错…

js什么情况下使用同步,什么时候异步加载

JavaScript 中的同步和异步操作主要取决于代码的执行过程。以下是一些常见的同步和异步使用场景: 同步操作: 基本操作: 赋值、算术运算、逻辑判断等基本语句,这些操作都是同步执行的。 DOM 操作: 获取、修改 DOM 元素的属性和内容,这些操作都是同步执行的。 阻塞操作: 一些耗…

el-table表头使用el-dropdown出现两个下拉框

问题描述&#xff1a;el-table在固定右边列时&#xff0c;表头使用el-dropdown会出现两个下拉框&#xff0c;如图所示&#xff1a; 解决方法&#xff1a; 1.只显示第一个下拉框&#xff0c;通过控制样式将其他的下拉框display:none; 2.如图所示&#xff0c;修改插槽写法&…

<数据集>学生课堂行为识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;13899张 标注数量(xml文件个数)&#xff1a;13899 标注数量(txt文件个数)&#xff1a;13899 标注类别数&#xff1a;8 标注类别名称&#xff1a;[js, tt, dk, zt, dx, zl, jz, xt] # 举手 js # 抬头听课 …