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

news2024/11/18 6:35:32

系列文章目录

通过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.coloradmin.cn/o/705447.html

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

相关文章

强化学习从基础到进阶-案例与实践[5.1]:Policy Gradient-Cart pole游戏展示

强化学习从基础到进阶-案例与实践[5.1]&#xff1a;Policy Gradient-Cart pole游戏展示 强化学习&#xff08;Reinforcement learning&#xff0c;简称RL&#xff09;是机器学习中的一个领域&#xff0c;区别与监督学习和无监督学习&#xff0c;强调如何基于环境而行动&#x…

关于u(x,t)=f(x)*g(t)形式证明的思考

突然想起来&#xff0c;二维高斯函数是可以拆分成两个一维高斯函数相乘的&#xff1a; 原来在学概率论的时候&#xff0c;证明过&#xff0c;这只能说高斯函数可以&#xff0c;这是一个思路。 一维波动函数应该也是这个套路。 那么还有没有其他函数可以如此&#xff0c;有如此…

javascript和css实现瀑布流排列

Grid 布局 实现瀑布流 html <div class"gridDiv"><divv-for"(item,index) in 20":style"{grid-row: auto / span ${heightArray[index]}}"><div class"gridItemConten"><div class"gridText">{{ite…

VS2022编译运行VS2015的项目

最近新装了VisualStudio2022&#xff0c;有一些VS2015老的项目需要运行&#xff0c;但不想再安装VS2015&#xff0c;就想能否直接在VS2022编译运行&#xff0c;研究一下发现可行&#xff0c;记录一下。 1. 直接升级VS2015项目到2022使用windows sdk 10.0 发现老代码里的一些语…

#10044 「一本通 2.2 例 2」Power Strings(KMP)(内附封面)

题目描述 原题来自&#xff1a;POJ 2406 给定若干个长度 \le 10^6 的字符串&#xff0c;询问每个字符串最多是由多少个相同的子字符串重复连接而成的。如&#xff1a;ababab 则最多有 3 个 ab 连接而成。 输入格式 输入若干行&#xff0c;每行有一个字符串。特别的&#xf…

第一章:R-CNN网络详解(丰富特征层次用于准确的目标检测和语义分割技术报告(v5))

(目标检测篇&#xff09;系列文章目录 第一章:R-CNN网络详解 第二章:Fast R-CNN网络详解 第三章:Faster R-CNN网络详解 第四章:YOLO v1网络详解 第五章:YOLO v2网络详解 第六章:YOLO v3网络详解 文章目录 系列文章目录技术干货集锦前言一、摘要二、正文分析 1.引入库2.读入…

迅为RK3568/RK3588开发板视频教程 | RKNPU2 从入门到实践一套搞定!

迅为电子嵌入式视频教程更新了&#xff01;——「AI深度学习推理加速器--RKNPU2 从入门到实践」&#xff08;基于RK3588和RK3568&#xff09; 课程内容分为三个阶段&#xff1a;认识RKNPU、RKNPU开发学习以及项目实战。 首先&#xff0c;我们将从认识RKNPU阶段开始&#xff0…

Redis实战——短信登录(一)

项目搭建 前期准备 导入SQL CREATE TABLE tb_user (id bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 主键,phone varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 手机号码,password varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4…

【Redis】Redis主从复制哨兵模式集群

文章目录 一、Redis 持久化1. 主从复制2. 哨兵模式3. 集群 二、 Redis 主从复制1. 概述2. 主从复制的作用3. 主从复制流程4. 搭建 Redis 主从复制4.1 环境准备4.2 安装 Redis4.3 修改 Master 节点配置文件4.4 修改Slave节点配置文件&#xff08;Slave1和Slave2配置相同&#xf…

关于Docker中 docker build 时no such file or directory报错

ERROR: failed to solve: failed to read dockerfile: open /var/lib/docker/tmp/buildkit-mount545066663/Dockerfile: no such file or directory 主要原因是命令行没有在文件夹下执行docker build&#xff0c;cd到指定文件夹下执行即可

windows-x86使用qemu打开x86和arm虚拟机

1、下载qemu软件 下载固件&#xff08;UEFI固件镜像文件&#xff0c;BIOS的替代方案&#xff09;&#xff09; 2、配置qemu环境变量 使用cmd执行qemu命令&#xff0c;配置好环境变量比较方便 3、准备镜像 准备好一个x86的镜像或者arm的镜像&#xff0c;格式可以为qcow2 4、打…

STM32 时钟 寄存器 异常和中断

时钟: 51单片机中有时钟和时钟树的概念&#xff0c;外设只有GPIO、定时器、和一个串口&#xff0c;使用的都是11.0592MHZ的频率&#xff0c;除了定时器外&#xff0c;其他外设只要上电就可以使用。 stm32不同外设对应的时钟频率不同&#xff0c;故有时钟树的概念 PLL&#xf…

提升半导体制造效率,了解半导体CMS系统的关键作用

随着半导体制造业的不断发展&#xff0c;提高生产效率成为企业追求的核心目标。在这一背景下&#xff0c;CMS系统&#xff08;中央设备状态监控系统&#xff09;的关键作用愈发凸显。本文将深入探讨CMS系统在提升半导体制造效率方面的关键作用&#xff0c;帮助读者全面了解该系…

Android Studio Could not reserve enough space for 2097152KB object heap

Android Studio Could not reserve enough space for 2097152KB object heap android studio 编译的项目的时候&#xff0c;出现的内存不足问题&#xff0c;实际上android studio会有引导设置内存大小&#xff0c;可能都不太在意在哪个地方&#xff0c;设置完就完事了&#xff…

linux上搭建samba服务

Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件&#xff0c;由服务器及客户端程序构成。SMB&#xff08;Server Messages Block&#xff0c;信息服务块&#xff09;是一种在局域网上共享文件和打印机的一种通信协议&#xff0c;它为局域网内的不同计算机之间提供文件及打…

【NOSQL数据库】Rdeis持久化

目录 一、Redis高可用1.2Redis高可用技术 二、Redis持久化2.1Redis提供的两种持久话方式 三、RDB持久化3.1触发条件3.1.1手动触发3.1.2自动触发3.1.3其他自动触发机制 3.2执行流程3.3启动时加载 四、AOF持久化4.1 开启AOF4.2执行流程4.2.1命令追加(append)4.2.2文件写入(write)…

【LeetCode热题100】打卡第30天:从前序遍历与中序遍历序列构造二叉树二叉树展开为链表

文章目录 【LeetCode热题100】打卡第30天&#xff1a;从前序遍历与中序遍历序列构造二叉树&二叉树展开为链表⛅前言 从前序与中序遍历构造二叉树&#x1f512;题目&#x1f511;题解 从中序与后序遍历构造二叉树&#x1f512;题目&#x1f511;题解 二叉树展开为链表&#…

使用 Maya Mari 设计 3D 波斯风格道具(p1)

今天瑞云渲染小编给大家带来了Simin Farrokh Ahmadi 分享的Persian Afternoon 项目过程&#xff0c;解释了 Maya 和 Mari 中的建模、纹理和照明过程。 介绍 我的名字是西敏-法罗赫-艾哈迈迪&#xff0c;人们都叫我辛巴 在我十几岁的时候&#xff0c;我就意识到我喜欢艺术和创造…

python最佳开发环境组合(pycharm+anaconda)

一、pycharmanaconda是python 最佳开发环境组合 1.pycharm与vscode对比 pycharm社区版与pycharm pro pycharm pro 与vscode 二、anaconda Anaconda Python 集成包 工具箱。 所以没有必要下载传统Python (cPython)个人十分不推荐使用传统python做科学计算&#xff0c; 一来…

【王道·操作系统】第五章 输入输出管理【未完】

一、I/O设备 1.1 I/O设备的基本概念 I/O&#xff0c;Input/Output&#xff1a;输入/输出I/O 设备&#xff1a;将数据输入到计算机&#xff0c;或者可以接收计算机输出数据的外部设备&#xff0c;属于计算机中的硬件部件UNIX系统将外部设备抽象为一种特殊的文件&#xff0c;用户…