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.mzph.cn/web/45936.shtml

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

相关文章

面试高级 Java 工程师:2024 年的见闻与思考

面试高级 Java 工程师&#xff1a;2024 年的见闻与思考 由于公司业务拓展需要&#xff0c;公司招聘一名高级java工程研发工程师&#xff0c;主要负责新项目的研发及老项目的维护升级。我作为一名技术面试官&#xff0c;参与招聘高级 Java 工程师&#xff0c;我见证了技术领域的…

LATEX格式的高等数学题库(导数和概率论与数理统计)

\documentclass{ctexart} \usepackage{amsmath,amssymb,amsfonts,hyperref} \usepackage{CJKutf8} \usepackage{enumitem} % 引入宏包 \usepackage [colorlinkstrue] {} \begin{document}\begin{CJK}{UTF8}{gkai}%正文放在此行下与\end{CJK}之间就行\tableofcontents\newpage\s…

F1-score(标准度量)

什么是F1-score&#xff1f; F1分数&#xff08;F1-score&#xff09;是分类问题的一个衡量指标。一些多分类问题的机器学习竞赛&#xff0c;常常将F1-score作为最终测评的方法。它是精确率和召回率的调和平均数&#xff0c;最大为1&#xff0c;最小为0&#xff0c;如公式1所示…

高效转换:CSV 转 JSON 数组 API

在日常数据处理和分析中&#xff0c;CSV 和 JSON 是两种常见的数据格式。无论是开发者还是数据科学家&#xff0c;经常需要在这两种格式之间转换。我们提供的 CSV 转 JSON 数组 API 可以帮助您轻松完成这一任务。 功能特点&#xff1a; 多种输入方式&#xff1a;支持直接粘贴…

使用GPT3.5,LangChain,FAISS和python构建一个本地知识库

引言 介绍本地知识库的概念和用途 在现代信息时代&#xff0c;我们面临着海量的数据和信息&#xff0c;如何有效地管理和利用这些信息成为一项重要的任务。本地知识库是一种基于本地存储的知识管理系统&#xff0c;旨在帮助用户收集、组织和检索大量的知识和信息。它允许用户…

C语言-->指针详解

提示&#xff1a;本系列文章是C语言的重难点–>指针 C语言-->指针详解 前言一、什么是指针&#xff1f;二、指针的声明与初始化三、指针的解引用四、指针与数组五、指针与函数六、动态内存分配七、常见错误与注意事项总结我是将军我一直都在&#xff0c;。&#xff01; 前…

Oracle或MySQL数据迁移到国产数据库后的注意事项

一、人大金仓Kingbase 1、初始化后兼容 创建sysdate()方法兼容原生MySQL模式下不具备sysdate()的问题&#xff1a; create or replace function sysdate() returns timestamp with time zone as select current_timestamp; language sql; 2. 执行语句收集统计信息&#xff…

1.5-协程基础与关键知识:连接线程的世界-回调型 API 协作

文章目录 线程 API 转换成挂起函数&#xff1a;suspendCoroutine支持取消的 suspendCoroutine&#xff1a;suspendCancellableCoroutine总结 线程 API 转换成挂起函数&#xff1a;suspendCoroutine 在实际项目中即使已经使用协程了&#xff0c;可是要完全避免跟传统的线程 API…

Excel 学习手册 - 精进版(包括各类复杂函数及其嵌套使用)

作为程序员从未想过要去精进一下 Excel 办公软件的使用方法&#xff0c;以前用到某功能都是直接百度&#xff0c;最近这两天跟着哔哩哔哩上的戴戴戴师兄把 Excel 由里到外学了一遍&#xff0c;收获良多。程序员要想掌握这些内容可以说是手拿把掐&#xff0c;对后续 Excel 的运用…

linux的学习(七):读取,函数,正则表达式,文本处理工具cut和awk

##简介 shell编程中的读取&#xff0c;函数&#xff0c;正则表达式&#xff0c;文本处理工具的简单使用 read read&#xff1a;读取控制台的输入 参数&#xff1a; -p&#xff1a;指定读取时的提示符-t&#xff1a;等待读取的时间 脚本例子 编写i.sh脚本&#xff0c;enter…

算法实验3:贪心算法的应用

实验内容 &#xff08;1&#xff09;活动安排问题 设有n个活动的集合E{1, 2, …, n}&#xff0c;其中每个活动都要求使用同一资源&#xff0c;而在同一时间内只有一个活动能使用这一资源。每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi&#xff0c;且si <f…

JavaWeb-【2】CSS和JavaScript

笔记系列持续更新,真正做到详细!!本次系列重点讲解后端,那么第一阶段先讲解前端【续上篇HTML】 目录 一、CSS 1、CSS介绍 2、CSS快速入门 3、CSS语法 4、字体颜色和边框 5、背景颜色和字体样式 6、div和文本居中 7、超链接去下划线和表格细线 8、无序列表去掉样式…

持续集成03--Jenkins的安装与配置

前言 在持续集成/持续部署&#xff08;CI/CD&#xff09;的实践中&#xff0c;Jenkins作为一个开源的自动化服务器&#xff0c;扮演着至关重要的角色。本篇“持续集成03--Jenkins的安装配置”将带您走进Jenkins的世界&#xff0c;深入了解如何在Linux环境中安装并配置Jenkins。…

VUE:跨域配置代理服务器

//在vite.config。js中&#xff0c;同插件配置同级进行配置server:{proxy:{"/myrequest":{//代理域名&#xff0c;可自行修改target:"https://m.wzj.com/",//访问服务器的目标域名changeOrigin:true,//允许跨域configure:(proxy,options) > {proxy.on(&…

人工智能与人类社会的共生共荣

随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;已经不再是遥不可及的概念&#xff0c;而是深深地融入到了我们的日常生活中。从智能家居到智慧城市&#xff0c;从自动驾驶到医疗诊断&#xff0c;人工智能正以前所未有的方式改变着人类社会的每一个角落。然…

掌握Laravel控制器:构建强大应用的基石

掌握Laravel控制器&#xff1a;构建强大应用的基石 在Laravel框架中&#xff0c;控制器&#xff08;Controller&#xff09;是处理用户请求和返回响应的核心组件。控制器充当了应用逻辑的中转站&#xff0c;它接收来自路由的请求&#xff0c;处理这些请求&#xff0c;并返回视…

C4D各版本软件下载+自学C4D 从入门到精通【学习视频教程全集】+【素材笔记】

下载链接&#xff1a; 迅雷网盘https://pan.xunlei.com/s/VO1tydOxEo-Az_QCM-Jz2R4RA1?pwdvxg4# 夸克网盘https://pan.quark.cn/s/fe7450b02d80 百度网盘https://pan.baidu.com/s/1Omj4WL93F1DNdA2iP4SiMQ?pwdwmb8

[C++] 深度剖析C_C++内存管理机制

文章目录 内存分布内存分布图解 C语言中动态内存管理方式malloc:callocrealloc C内存管理方式内置类型**自定义类型** operator new & operator deleteoperator new & operator delete函数operator newoperator delete **new T[N]** 与**delete[]** **定位new表达式(pl…

vue 实现下拉框的数据是树状结构

页面显示效果 vue实现代码 <el-form-item label"公司名称" prop"comName"><el-select ref"select" v-model"queryParams.comName" placeholder"请选择公司名称" clearable size"small"change"handl…

可学习激活函数 Maxout

可学习激活函数 Maxout 是一种神经网络中的激活函数&#xff0c;它在特征提取的过程中能够学习到最优的激活方式&#xff0c;从而提高模型的表达能力和性能。Maxout 由 Ian Goodfellow 等人在2013年提出&#xff0c;是一种能够在训练过程中自适应地选择激活函数的模型。 Maxou…