当前位置: 首页 > news >正文

Qt判定鼠标是否在该多边形的线条上

要判断鼠标是否在由QPainterPath或一系列QPointF点定义的多边形的线条上,你可以使用以下步骤:

  1. 获取鼠标当前位置:在鼠标事件中,使用QMouseEventpos()方法获取鼠标的当前位置。

  2. 检查点与线段的距离:遍历多边形的每条线段,使用点到线段距离的公式计算鼠标位置到每条线段的距离。

  3. 比较距离与阈值:如果距离小于某个阈值(例如像素单位的5或10),则可以认为鼠标位于线条上。

    #include <QMouseEvent>
    #include <QVector>
    #include <QPointF>
    #include <QDebug>// ...// 假设你有一个成员变量或局部变量rectPoints
    QVector<QPointF> rectPoint;
    rectPoint << QPointF(50, 50) << QPointF(150, 50)<< QPointF(150, 150) << QPointF(50, 150);// 在你的控件的鼠标事件处理函数中
    void MyWidget::mousePressEvent(QMouseEvent *event) {QPointF mousePos = event->localPos(); // 获取鼠标在控件内的位置double threshold = 5.0; // 设置一个阈值,根据具体情况调整if (isMouseOnPolyline(mousePos, rectPoints, threshold)) {qDebug() << "Mouse is on the polyline";// 鼠标在多边形线条上的处理逻辑} else {qDebug() << "Mouse is not on the polyline";// 鼠标不在多边形线条上的处理逻辑}
    }// 辅助函数:计算点到线段的距离
    double pointToLineDistance(const QPointF &p, const QPointF &p1, const QPointF &p2) {double dx = p2.x() - p1.x();double dy = p2.y() - p1.y();if (qFuzzyIsNull(dx) && qFuzzyIsNull(dy)) {return qAbs(p.x() - p1.x());}double t = ((p.x() - p1.x()) * dx + (p.y() - p1.y()) * dy) / (dx * dx + dy * dy);t = qBound(0.0, t, 1.0);QPointF nearestPoint = p1 + t * (p2 - p1);return (p - nearestPoint).manhattanLength();
    }// 检查鼠标点击是否在多边形线条上
    bool isMouseOnPolyline(const QPointF &mousePos, const QVector<QPointF> &points, double threshold) {QPointF currentPoint = points.last(); // 从最后一个点开始foreach (const QPointF &nextPoint, points) {if (pointToLineDistance(mousePos, currentPoint, nextPoint) < threshold) {return true;}currentPoint = nextPoint;}return false; // 如果没有找到,则返回false
    }

    在这个示例中,pointToLineDistance函数计算了给定点到线段的最近点的距离。isMouseOnPolyline函数遍历多边形的所有线段,并使用pointToLineDistance函数检查鼠标位置是否在指定的阈值内。如果是,则可以认为鼠标位于线条上。

    请注意,阈值(threshold)是一个敏感度参数,你可以根据实际需要调整这个值。此外,mousePos是鼠标事件提供的当前鼠标位置,rectPoints是多边形顶点的数组。在实际使用中,你需要将这些变量替换为你的具体值。

http://www.lryc.cn/news/403793.html

相关文章:

  • 【笔记:3D航路规划算法】一、随机搜索锚点(python实现,讲解思路)
  • ubuntu如何彻底卸载android studio?
  • 使用Windows Linux 子系统安装 Tensorflow,并使用GPU环境
  • C++案例三:猜数字游戏
  • LNMP架构部署及应用
  • 【医学影像】X86+FPGA:支持AI医学影像设备应用的工控主板,赋能CT、MRI、X线、超声等医学影像设备
  • 【PostgreSQL】PostgreSQL简史
  • Linux的热插拔UDEV机制和守护进程
  • laravel框架基础通识-新手
  • c++ extern 关键字
  • Meta KDD Cup 2024 CRAG: Comphrehensive RAG Benchmark参赛指南(写了一半跑去改大论文了所以没正式参赛)
  • 系统架构设计师教程 第3章 信息系统基础知识-3.7 企业资源规划(ERP)-解读
  • windows实现自动化按键
  • 阿里云 https证书部署
  • DX-10A信号继电器 柜内安装,板前接线 约瑟JOSEF
  • 芯片光刻后的晶片多层组合构成的吗
  • OpenGL-ES 学习(7) ---- VBO EBO 和 VAO
  • github如何实现和gitlab的同步
  • 内网隧道——隧道技术基础
  • NAS新品“翻车”后,绿联科技要上市了
  • kafka-client如何打印连接日志
  • 1、springboot3 vue3开发平台-后端-项目构建
  • 修改了mybatis的xml中的sql不重启服务器如何动态加载更新
  • Intel和AMD用户再等等!微软确认Win11 24H2年底前登陆
  • Web开发:图片九宫格与非九宫格动态切换效果(HTML、CSS、JavaScript)
  • 价格较低,功能最强?OpenAI 推出 GPT-4o mini,一个更小、更便宜的人工智能模型
  • 【学习笔记】无人机系统(UAS)的连接、识别和跟踪(八)-无人机探测与避让(DAA)机制
  • 网络结构-组件-AI(九)
  • 弹性网络回归(Elastic Net Regression)
  • 【深度学习】FaceChain-SuDe,免训练,AI换脸