(二)Qt QGraphicsScene模块实现圆点绘制在所有窗体的最前方,实现圆点的“彩色拖尾”效果以及“选中方框”效果

系列文章目录

通过Qt实现手势识别控制软件操作相关系列技术方案

(一)Qt 将某控件、图案绘制在最前面的方法,通过QGraphicsScene模块实现
(二)Qt QGraphicsScene模块实现圆点绘制在所有窗体的最前方,实现圆点的“彩色拖尾”效果以及“选中方框”效果
(三)Qt 动态手势识别“握拳”
(四)Qt 动态手势识别“手掌随动”+“握拳选择”
(五)Qt 动态手势识别“左右滑动”以及实现翻页效果

文章目录

  • 系列文章目录
  • 前言
  • 1、效果
  • 2、代码实现
    • 2.1 思路
    • 2.1.1 “拖尾”效果
    • 2.1.2 “选中方框区域”效果
    • 2.2 代码
  • 总结


前言

  在本系列第(一)篇文章中讲解了Qt,如何使用QGraphicsScene在一个已经有ui的界面最前方绘制控件而不被已经有的ui界面遮挡。
  本篇文章在其基础上实现增强效果。即,修改单独的“黑点”为带“拖尾”效果的彩色圆点,且对彩色圆点当前所在的位置进行判断,若其位置在后面ui界面的某个“黄色方块上”时,将该方块整体设置为“绿色”。


1、效果

  控制前端的“红色”圆点移动,同时产生“彩色拖尾”效果,当“红色”圆点移动至对应区域的“黄色方块”位置的时候,相应的“黄色方块”改变为“绿色方块”。
  带“拖尾”圆点移动,并且激活后面方框背景的效果如图1所示。图1

图1 带“拖尾”圆点移动,并且激活后面方框背景的效果

2、代码实现

2.1 思路

2.1.1 “拖尾”效果

  要实现黑点的拖尾效果,可以通过在BackWidget中使用一个存储历史位置的队列来实现。
  首先,在BackWidget的头文件中添加一个QQueue类型的成员变量,用于存储历史位置:

private:
    QQueue<QPointF> historyPoints;

  然后,在point_update函数中,更新historyPoints队列,将当前位置添加到队列中,并保持队列的大小不超过你想要的拖尾点的数量(例如10个):

void BackWidget::point_update(QList<QPointF>* points)
{
    delete pointsInWidget;
    pointsInWidget = new QList<QPointF>(*points);
    delete points;

    // 更新历史位置
    historyPoints.enqueue((*pointsInWidget)[9]); // 添加当前位置到队列末尾
    while (historyPoints.size() > 10) {
        historyPoints.dequeue(); // 如果队列超过10个点,则移除队列头部的点
    }
    update();
}

  接下来,在paintEvent函数中,除了绘制当前位置的黑点,还需要根据历史位置绘制拖尾效果。可以使用QQueue的toVector函数将队列转换为QVector类型,并迭代绘制每个历史位置的小黑点:

void BackWidget::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event)

    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing, true);

    // 绘制拖尾效果
    QVector<QPointF> historyPointsVec = historyPoints.toVector();
    for (int i = 0; i < historyPointsVec.size(); ++i) {
        QPointF point = historyPointsVec.at(i);
        draw_point(painter, point, 10 - i); // 绘制小黑点,半径逐渐减小
    }

    // 绘制当前位置的黑点
    QPointF currentPoint = (*pointsInWidget)[9];
    draw_point(painter, currentPoint, 0); // 绘制当前位置的黑点
}

  最后,在draw_point函数中添加一个额外的参数radius,用于控制黑点的半径大小:

void BackWidget::draw_point(QPainter& painter, const QPointF& point, int radius)
{
    painter.setBrush(QBrush(Qt::black));
    painter.drawEllipse(QPointF(point.x() * width(), point.y() * height()), radius, radius);
}

  这样,每次更新位置时,就会根据历史位置绘制出一条黑点的拖尾效果。

2.1.2 “选中方框区域”效果

  要实现“选中方框区域”效果,只需要判断“黑点”的中心位置与所有“黄色方框区域”是否产生重叠。
  通过下面三句话,分别获取黑点的中心坐标、区域位置以及是判断否包含。

        center = QPointF(center.x()*width(),center.y()*height());
        QRectF widgetRect = QRectF(widget->geometry()).translated(view->mapFromParent(this->pos()));

        // 使用contains判断矩形是否包含点
        if (widgetRect.contains(center)) {
            isOverlap = true;
        }

  这里需要提前申请一块内存空间用于存储ui界面中的8个QWidget的指针变量,通过for循环进行遍历。

void BackWidget::updateColorWidgets()
{
    for (QWidget* widget : colorWidgets)
    {
        bool isOverlap = false;
        QPointF center;

        //这一步的center只是相对位置坐标,绝对位置需要×width()或height()
        if (pointsInWidget->size() >= 10)
        {
            center = (*pointsInWidget)[9];
        }

        center = QPointF(center.x()*width(),center.y()*height());
        QRectF widgetRect = QRectF(widget->geometry()).translated(view->mapFromParent(this->pos()));

        // 使用contains判断矩形是否包含点
        if (widgetRect.contains(center)) {
            isOverlap = true;
        }

        // 根据是否重叠来设置背景颜色
        QString styleSheet;
        if (isOverlap) {
            styleSheet = "background-color: green;";
        } else {
            styleSheet = "background-color: rgba(255, 255, 0, 255);";
        }
        widget->setStyleSheet(styleSheet);
    }
}

2.2 代码

  本项目所有代码的获取,请私信与本人联系。


总结

  本系列文章,通过动、静态手势识别技术方式操控Qt界面软件实现相关操作功能:
(一)Qt 将某控件、图案绘制在最前面的方法,通过QGraphicsScene模块实现
(二)Qt QGraphicsScene模块实现圆点绘制在所有窗体的最前方,实现圆点的“彩色拖尾”效果以及“选中方框”效果
(三)Qt 动态手势识别“握拳”
(四)Qt 动态手势识别“手掌随动”+“握拳选择”
(五)Qt 动态手势识别“左右滑动”以及实现翻页效果

  本项目所有代码的获取,请私信与本人联系。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot 中的 WebSocketSession 是什么,原理,如何使用

Spring Boot 中的 WebSocketSession 是什么&#xff0c;原理&#xff0c;如何使用 介绍 在现代 Web 应用程序中&#xff0c;实时通信是一个非常常见的需求。传统的 HTTP 协议是无法支持实时通信的&#xff0c;因为它是一种无状态协议&#xff0c;每次请求都是独立的&#xff0…

LangChain:LLM应用程序开发(上)——Models、Prompt、Parsers、Memory、Chains

文章目录 一、Models、Prompt、Parsers1.1 环境配置&#xff08;导入openai&#xff09;1.2 辅助函数&#xff08;Chat API : OpenAI&#xff09;1.3 使用OpenAI API进行文本翻译1.4使用LangChain进行文本翻译1.5 使用LangChain解析LLM的JSON输出1.5.1 LangChain输出为string格…

基于Java的万年历(课设)

基于Java的万年历 资源链接&#xff1a;基于Java的万年历&#xff08;课设&#xff09; 文章目录 基于Java的万年历1 绪论2 需求分析3 概要设计3.1 类间组合框架3.2 布局结构示意3.3 对各个类的概述 4运行环境5 开发工具和编辑语言6 详细设计6.1 NiceCaelendar类6.2 NiceFram…

LeetCode 2501 数组中最长的方波 Java

方法一&#xff0c;哈希表枚举 构造哈希集合&#xff0c;记录出现过的数字枚举遍历 import java.util.HashSet; import java.util.Set;class Solution {public int longestSquareStreak(int[] nums) {//构造哈希表集合&#xff0c;记录出现过的数字&#xff0c;转long型&…

如何在Microsoft Excel中迅速冻结首行和末行

如果你正在处理一个大型电子表格&#xff0c;那么冻结某些行或列会很有用&#xff0c;这样当你滚动浏览工作表的其余部分时&#xff0c;它们会留在屏幕上。 当你在 Excel 中滚动浏览大的工作表时&#xff0c;你可能希望保留一些行或列&#xff0c;例如页眉。Excel 允许你通过以…

2023年华中杯数学建模B题小学数学应用题相似性度量及难度评估解题全过程文档及程序

2023年华中杯数学建模 B题 小学数学应用题相似性度量及难度评估 原题再现 某 MOOC 在线教育平台希望能够进行个性化教学&#xff0c;实现用户自主学习。在用户学习时&#xff0c;系统从题库中随机抽取若干道与例题同步的随堂测试题&#xff0c;记录、分析学生的学习和答题信息…

网络安全实战植入后门程序

在 VMware 上建立两个虚拟机&#xff1a;win7 和 kali。 Kali&#xff1a;它是 Linux 发行版的操作系统&#xff0c;它拥有超过 300 个渗透测试工具&#xff0c;就不用自己再去找安装包&#xff0c;去安装到我们自己的电脑上了&#xff0c;毕竟自己从网上找到&#xff0c;也不…

前端Vue自定义轮播图swiper 轮播图dot 轮播图指示indicate

前端Vue自定义轮播图swiper 轮播图dot 轮播图指示indicate&#xff0c;下载完整代码请访问uni-app插件市场地址&#xff1a;https://ext.dcloud.net.cn/plugin?id13193 效果图如下: ​ 编辑切换为居中 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; ​…

【HTTP 协议1】图文详解 HTTP 请求和应答报文

文章目录 前言一、认识 HTTP 协议1, 什么是 HTTP 协议2, HTTP 协议的报文格式 二、HTTP 请求报文1, 认识方法1.1, GET 和 POST 辨析(重点)1.2, 其他方法 2, 认识 URL3, 认识 Header3.1, Host3.2, Content-Length3.3 Content-Type3.4, User-Agent3.5, Referer3.6, Cookie(重点) …

【C#】并行编程实战:任务并行性(下)

本教程对应学习工程&#xff1a;魔术师Dix / HandsOnParallelProgramming GitCode 本章继续介绍任务并行性&#xff0c;因篇幅所限&#xff0c;本章为下篇。 6、处理任务异常 所有优秀的程序员都擅长高效地处理异常&#xff0c;这也是并行编程最重要的方面之一。任务并…

JMeter请求头添加删除方法(解决请求头类型冲突)

JMeter请求头添加删除方法&#xff08;解决请求头类型冲突&#xff09; 1. 为什么会有冲突 请求头的Content-Type类型在做上传和请求图片地址是&#xff0c;请求头类型是不一样的 请求图片地址&#xff1a;Content-Type: image/jpeg 一般的Restful接口&#xff1a;Content-Ty…

SpringBoot整合logback日志框架详解(提供Gitee源码)

前言&#xff1a;本篇博客主要介绍如何把主流的日志框架快速整合到目前的SpringBoot框架中&#xff0c;对六种日志等级进行介绍以及使用方法。 目录 一、日志级别 1、TRACE 2、DEBUG 3、INFO 4、WARN 5、ERROR 6、FATAL 二、导入pom.xml依赖 三、application.yml配置…

JS 1.如何实现继承 2.原型和原型链

1_使用class实现继承 /** 继承 */ class Person { constructor(name) { this.name name;}drink() { console.log(喝水)} }class Student extends Person{ constructor(name, score) { // new Personsuper(name);this.score score;}introduce() { console.log(我是${this.nam…

RISCV Reader笔记_4 乘除,浮点扩展

乘法和除法指令 前面了解过 RV32I不带乘除。扩展的RV32M里面有。 mul 较简单。div 是商&#xff0c;rem 是余数。 指令格式都差不多&#xff0c;基本就是靠 func 码确定变体。 因为两个32位数乘积是64位数&#xff0c;一条指令处理会比较复杂&#xff0c;因此分为两个指令计算…

vue+css中通过一个div的hover触发另一个的样式变化

思路 通过触发父div&#xff0c;除了改变父div的背景色外&#xff0c;还同时改变div中i标签的颜色 效果图 原本 hover触发后 html代码 <div class"user_addfrid"><i class"iconfont icon-friend-add"></i> </div> css代码 …

使用Xshell服务器跑程序,用pycharm连接服务器远程开发

目标&#xff1a; 1.使用Xshell在服务器上创建自己项目需要的虚拟环境 2.用pycharm实现远程服务器的连接&#xff08;这样就可以在本地debug或者写代码&#xff0c;然后再用xshell在服务器上跑&#xff09; 一、使用Xshell在服务器上创建自己项目需要的虚拟环境 1.打开Xshe…

LangChain-Agent自定义Tools类 ——输入参数篇(二)

给自定义函数传入输入参数&#xff0c;分别有single-input 参数函数案例和multi-input 参数函数案例&#xff1a; from langchain.agents import Tool from langchain.tools import BaseTool from math import pi from typing import Union from math import pi from typing …

利用nginx/apache代理wss 实现 小程序 端口 反向代理

除了用Workerman自身的SSL&#xff0c;也可以利用nginx/apache作为wss代理转发给workerman 我就是栽在这大坑里&#xff08;nginx/apache代理wss&#xff0c;workerman部分就不要设置ssl&#xff0c;否则将无法连接&#xff0c;两个方法2选1&#xff09;官方推荐用nginx/apach…

Oracle VM VirtualBox添加磁盘

文章目录 1、Oracle VM VirtualBox添加磁盘 1、Oracle VM VirtualBox添加磁盘 1.关闭正在启动的Oracle VM VirtualBox 2、选择存储 3、点击最右边 4、选择创建 直接下一步&#xff1a; 直接下一步&#xff1a; 调整需要的大小–创建即可: 此时此刻磁盘加载成功&#xff0…

如何预防DDOS和CC攻击

在当今数字化世界中&#xff0c;网络安全成为各行各业亟需解决的重要问题。最近&#xff0c;由于DDoS&#xff08;分布式拒绝服务&#xff09;和CC&#xff08;恶意咨询&#xff09;攻击事件的频繁发生&#xff0c;网络安全进一步引起了人们的关注。 据可靠消息源透露&#xff…