Qt之实现移动的方块(蚂蚁线)

2023-05-16

一、简介

移动的小方块或者说是类似移动的蚂蚁线,从一篇文章看到的,挺有趣的就自己做了一个,可以自由添加方块的个数,起始位置,方块的宽度,方块移动速度等待参数,下方是实现的代码,如果有需要新增的参数可以自行添加。

效果图

在这里插入图片描述

二、代码之路

AntsLineWidget.h

#pragma once

#include <QtWidgets/QWidget>
#include <QTimer>

class AntsLineWidget : public QWidget
{
    Q_OBJECT

public:
    AntsLineWidget(QWidget *parent = Q_NULLPTR);

    // 设置方块的宽度;
    void setBlockWidth(int width);

    // 根据起始位置生成方块;
    void generateBlockPath(int startPos);

    // 设置绿色位置;
    void setGreenPos(int greenPos);

    // 设置移动速度;
    void setMoveSpeed(int moveSeed);

private slots:
    // 更新位置;
    void updatePos();

private:
    void paintEvent(QPaintEvent *event);

    void resizeEvent(QResizeEvent *event);

private:
    // 方块移动时钟;
    QTimer m_moveTimer;
    // 方块绘制Path;
    QList<QPainterPath> m_blockPathList;
    // 方块宽度;
    int m_blockWidth;
    // 方块变绿位置;
    int m_greenPos;
    // 方块移动速度;
    int m_moveSpeed;
};


AntsLineWidget.cpp

#include "AntsLineWidget.h"
#include <QPainter>

#define SPACE_WIDTH 20

AntsLineWidget::AntsLineWidget(QWidget *parent)
    : QWidget(parent)
    , m_blockWidth(80)
    , m_greenPos(200)
    , m_moveSpeed(50)
{
    connect(&m_moveTimer, SIGNAL(timeout()), this, SLOT(updatePos()));
    m_moveTimer.start(m_moveSpeed);
}

void AntsLineWidget::setBlockWidth(int width)
{
    m_blockWidth = width;
}

void AntsLineWidget::generateBlockPath(int startPos)
{
    QPainterPath path;
    path.addRect(QRect(startPos, 2, m_blockWidth, this->height() - 3));
    m_blockPathList.append(path);
}

void AntsLineWidget::setGreenPos(int greenPos)
{
    m_greenPos = greenPos;
}

void AntsLineWidget::setMoveSpeed(int moveSpeed)
{
    m_moveSpeed = moveSpeed;
    m_moveTimer.setInterval(m_moveSpeed);
}

void AntsLineWidget::updatePos()
{
    for (int i = 0; i < m_blockPathList.count(); i++)
    {
        QPainterPath& path = m_blockPathList[i];
        // 移动步长;
        path.translate(QPoint(-2, 0));
        if (path.boundingRect().right() < SPACE_WIDTH)
        {
            QPainterPath pathNew;
            pathNew.addRect(QRect(this->width() - SPACE_WIDTH - m_blockWidth, 2, m_blockWidth, this->height() - 3));
            path = pathNew;
        }
    }

    update();
}

void AntsLineWidget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.setPen(QPen(QColor(57, 141, 255), 3));

    painter.drawLine(QPoint(0, 0), QPoint(this->width(), 0));

    for (int i = 0; i < m_blockPathList.count(); i++)
    {
        QPainterPath path = m_blockPathList[i];
        if (path.boundingRect().left() < SPACE_WIDTH)
        {
            int headPathWidth = m_blockWidth - SPACE_WIDTH + path.boundingRect().left();
            int tailPathWidth = m_blockWidth - headPathWidth;
            QPainterPath newPath;
            newPath.addRect(QRect(SPACE_WIDTH, 2, headPathWidth, this->height() - 3));
            newPath.addRect(QRect(this->width() - SPACE_WIDTH - tailPathWidth, 2, tailPathWidth, this->height() - 3));
            if (newPath.contains(QPoint(m_greenPos, this->height() / 2)))
            {
                painter.fillPath(newPath, Qt::green);
            }
            else
            {
                painter.fillPath(newPath, Qt::gray);
            }
        }
        else
        {
            if (path.contains(QPoint(m_greenPos, this->height() / 2)))
            {
                painter.fillPath(path, Qt::green);
            }
            else
            {
                painter.fillPath(path, Qt::gray);
            }
        }
    }

    painter.setPen(QPen(Qt::red, 2));
    painter.drawLine(QPoint(m_greenPos, this->height() - 1), QPoint(m_greenPos, this->height() - 20));
    painter.setPen(QPen(QColor(57, 141, 255), 1));
    painter.drawLine(QPoint(SPACE_WIDTH, this->height() - 1), QPoint(this->width() - SPACE_WIDTH, this->height() - 1));
}

void AntsLineWidget::resizeEvent(QResizeEvent *event)
{
    for (int i = 0; i < m_blockPathList.count(); i++)
    {
        QPainterPath& path = m_blockPathList[i];
        QPainterPath pathNew;
        QRectF rect = path.boundingRect();
        rect.setHeight(this->height() - 3);
        pathNew.addRect(rect);
        path = pathNew;
    }
}

main.cpp

include "AntsLineWidget.h"
#include <QtWidgets/QApplication>
#include <QHBoxLayout>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    // 测试代码;
    QWidget * widget = new QWidget;
    QHBoxLayout* hLayout = new QHBoxLayout(widget);
    widget->resize(1000, 150);
    AntsLineWidget w(widget);
    w.generateBlockPath(20);
    w.generateBlockPath(160);
    w.generateBlockPath(300);
    hLayout->addWidget(&w);

    widget->show();
    return a.exec();
}


以前就是全部的实现代码和测试代码,整个工程代码大家也可以加群311750285进行下载,更多好玩,有趣的在等着你 ^ _ ^

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt之实现移动的方块(蚂蚁线) 的相关文章

  • pipenv 无法获取系统环境变量

    今天遇到了一个有意思的问题 项目是使用pipenv作为虚环境来进行包管理的 xff0c 今天在windows server 2012R2和windows server 2016上发现python脚本在运行的过程中 xff0c 不能读取到系统
  • 创客基地oDrive第二课 X2212电机配置

    淘宝套装链接 B站视频链接 2021年3月31日前 入Q群 xff08 732557609 xff09 可抽奖oDrive主板 xff01 B站视频 创客基地oDrive第二课 X2212电机配置 第1部分 硬件介绍 1 1 硬件清单 oD
  • Makerbase X2212电流环(转矩)配置

    该配置基于X2212电机 xff0c 控制模式为电流环 xff08 转矩 xff09 模式 主板参数 电机参数 编码器参数配置和位置环控制一样 xff0c 已配置可直接跳转到控制器配置 xff0c 没有配置的按以下步骤配置 1 恢复默认参数
  • Postman -中文版-安装教程

    一 下载 安装 Postman 下面是历史版本的下载链接地址 请把链接中的 34 版本号 34 替换为指定的版本号 xff08 根据自己的需求变更 xff09 Windows64位 xff1a https dl pstmn io downl
  • HTTP Digest authentication

    Digest authentication xff09 是一个简单的认证机制 xff0c 最初是为 HTTP 协议开发的 xff0c 因而也常叫做 HTTP 摘要 xff0c 在 RFC2671 中描述 其身份验证机制很简单 xff0c 它
  • ubuntu离线安装Gcc、G++、Make

    前期准备 xff1a 由于GCC G 43 43 Make等工具依赖项众多 xff0c 我们需要提前先把基础依赖库下载并安装 xff0c 才能安装以上工具 工具安装包或基础依赖库下载参加以下Ubuntu官网链接 xff1a xff08 注意
  • 教你轻松在Ubuntu 部署yolov5,胎儿级教程

    环境 xff1a Jetson xavier nx Ubuntu 18 04 python3 8 一 yolov5安装 git clone https codechina csdn net mirrors ultralytics yolov
  • LWIP之lwip_select函数

    代码如下 xff1a Processing exceptset is not yet implemented int lwip select int maxfdp1 fd set readset fd set writeset fd set
  • ubuntu下的c++编译

    刚开始使用ubuntu下的g 43 43 编译c 43 43 程序 xff0c 这里只是简单说以下自己的一些小小感受吧 1 环境准备 在ubuntu中要想编译c程序可以安装gcc编译器 xff0c 编译c 43 43 的话就不能使用gcc了
  • c++ vector的用法

    vector是STL的动态数组 xff0c 可以在运行中根据需要改变数组的大小 因为它以数组的形式储存 xff0c 所以它的内存空间是连续的 vector的头文件为 include lt vector gt 常用方法 xff1a 1 vec
  • 使用python将数据导出excel表格

    python可用于数据分析 xff0c 有时候获得了数据需要导出以作其他作用 本文就介绍python导出excel表格的方法 导出excel表格 xff0c python提供了两个库 xff1a xlwt xlrd 本文只讨论下大致框架 s
  • matlab制作散点图及颜色调配

    散点图也是比较常用的数据分析图 xff0c 今天来聊聊用matlab如何画一个散点图出来 xff01 在matlab中 xff0c 对应散点图的函数是scatter 参数形式为scatter 横坐标 xff0c 纵坐标 xff0c 颜色 x
  • matlab——修改图中字体

    在画图的时候 xff0c 我们可以使用xlabel命名x轴的名字 xff0c 使用ylabel命名y轴的名字 xff0c 使用legend命名变量的名字 xff0c 使用title命名图片的标题 但标题的字体 xff0c 大小都是默认的 其
  • python绘制热力图

    在python中绘制热力图大致有两种方法通过matplotlib库的imshow函数以及seaborn库的heatmap函数 xff0c 通过笔者尝试 xff0c seaborn库更加灵活 xff0c 本篇以seaborn为准 源代码如下
  • 基址寻址和变址寻址区别(白话版)

    在寻址方式里面 xff0c 基址寻址和变址寻址是比较常用的两种寻址方式 但因为两种太像了 xff0c 总是搞不清楚 上网查到的描述太过专业看起来特别吃力 写这篇 xff0c 希望能用一种通俗易懂的方式对二者做个区分 为什么总容易搞混呢 xf
  • ROS修改pkg名和node名教程

    修改pkg名 有的时候最开始起了一个功能包package名 xff0c 但后来要进行修改 修改package名 xff0c 需要改两步然后重新catkin make即可 操作如下 xff1a 再回到工作空间执行catkin make即可 参
  • ROS-TCP-Connector and ROS-TCP-Endpoint

    Unity官方提供了和ROS交互的接口 xff1a ROS TCP Connector and ROS TCP Endpoint 有了这两个Unity就能够更好的和真实机器人做交互 两个接口的实现基于ROS ros bridge xff0c
  • Python 使用can模块(记录稿)

    直接安装 xff1a pip install python can 如果报这个错 更新一下pip pip3 install upgrade pip 或者是 pip install upgrade pip 再安装wrapt pip insta
  • Android Studio报错:W/System.err: java.net.SocketException: socket failed: EPERM (Operation not permitt

    解决方案 xff1a 在AndroidManifest xml中增加 xff1a span class token operator lt span uses span class token operator span permissio

随机推荐

  • C++简单实现http服务端客户端传输实例

    使用本代码有两个注意事项 xff1a 代码使用到了httplib库 xff0c 需要下载然后把 h文件放到自己的目录下 httplib下载地址 xff1a https gitcode net mirrors yhirose cpp http
  • VSCODE连接vmware虚拟机

    有时候想用VSOCDE中的ssh连接虚拟机 桥接模式 的终端进行操作 xff0c 但是执行ssh命令后总是报错 xff1a Could not connect to span class token number 192 168 span
  • 字符串加密工具

    可用于密码加密 xff0c 代码上阵 xff1a package com util import java security MessageDigest import java security NoSuchAlgorithmExcepti
  • 【RPLIDAR】ubuntu18.04安装cartographer源码并使用RPLIDAR A2M8 - R4建图

    1 创建工作空间 mkdir cartographer ws cd cartographer ws wstool init src 2 下载cartographer源码包 wstool merge t src https raw githu
  • 《C++ Primer Plus》学习笔记——第一章 介绍C++

    C 43 43 在C语言的基础上添加了面向对象编程和泛型编程 C 43 43 继承了C语言高效 简洁 快速和可移植性的传统 C 43 43 比C多了两样编程方法 xff0c 这使得它功能强大 xff0c 同样也意味着使用者需要学习更多的内容
  • 【转载】理解SIP的认证

    理解SIP的认证 From http blog sina com cn s blog 4b839a1b01000bqq html 1 认证和加密 认证 xff08 Authorization xff09 的作用在于表明自己是谁 xff0c
  • 尝试使用绕线法制作数字电路

    最近在学习电路制作的过程中 xff0c 发现使用洞洞板 xff0c 很难处理好具有很多复杂引脚的集成电路 用 锡接走线法 的话 xff0c 集成电路不能太多太复杂 xff0c 否则板子上很难排开 也可以用比较细的导线 xff0c 飞线焊接
  • 用C语言实现一个简单的HTTP客户端(HTTP Client)

    用C语言实现一个简单的HTTP Client xff08 HTTP客户端 xff09 作者 xff1a gobitan xff08 雨水 xff09 日期 xff1a 2007 04 03 转载请注明出处 http blog csdn ne
  • C语言常见的自定义数据类型(1)—— 结构体

    目录 1 结构体 1 1 结构体的定义 1 2 结构体的自引用 1 3 结构体类型的重命名 1 4 结构体的嵌套 2 结构体大小的计算 2 1 结构体内存对齐 2 2 嵌套结构体大小的计算 2 3 offsetof函数 2 4 修改默认对齐
  • 一篇解决!小白迷惑:Go mod本地包导入

    最近在学习go xff0c 在导入本都包遇到一个问题 xff0c 根据网上许多教程来都走不通 xff0c 最后在官网得到了最正确的答案 官网教程 xff1a Call your code from another module The Go
  • Linux nf_conntrack连接跟踪的实现

    连接跟踪 xff0c 顾名思义 xff0c 就是识别一个连接上双方向的数据包 xff0c 同时记录状态 下面看一下它的数据结构 xff1a struct nf conn Usage count in here is 1 for hash t
  • 组播MAC地址和各类IP地址

    MAC地址是以太网二层使用的一个48bit xff08 6字节十六进制数 xff09 的地址 xff0c 用来标识设备位置 MAC地址分成两部分 xff0c 前24位是组织唯一标识符 xff08 OUI Organizationally u
  • Linux内核中的软中断、tasklet和工作队列详解

    TOC 本文基于Linux2 6 32内核版本 引言 软中断 tasklet和工作队列并不是Linux内核中一直存在的机制 xff0c 而是由更早版本的内核中的 下半部 xff08 bottom half xff09 演变而来 下半部的机制
  • Linux内核中的各种锁

    Linux内核中的各种锁 在现代操作系统里 xff0c 同一时间可能有多个内核执行流在执行 xff0c 因此内核其实象多进程多线程编程一样也需要一些同步机制来同步各执行单元对共享数据的访问 尤其是在多处理器系统上 xff0c 更需要一些同步
  • Linux进程间通信方式

    进程与进程通信的概念进程通信的应用场景进程通信的几种方式 管道 管道简介管道原理 管道如何通信管道如何创建管道读写实现 管道api与用法 普通管道流管道命名管道 实现原理api与应用 匿名管道和有名管道总结 信号 信号来源信号生命周期和处理
  • C语言字节对齐问题详解

    引言 考虑下面的结构体定义 xff1a span class hljs keyword typedef span span class hljs keyword struct span span class hljs built in ch
  • git使用

    git使用 git clone时报如下错误 原因解决方法 TortoiseGit clone时报错 问题原因解决方法 git log使用git回归代码 git使用 本文记录的是工作中git是使用问题 xff0c 无脑模式 xff0c 遇到什
  • 内存对齐算法

    字节对齐是在分配内存时需要考虑的问题 xff0c 两个小算法 xff1a 1 最容易想到的算法 unsigned int calc align unsigned int n unsigned align if n align align 6
  • vscode快捷键整理

    1 注释 xff08 1 xff09 方式 注释 取消注释 xff1a Ctrl 43 xff08 2 xff09 方式 注释 xff1a Ctrl 43 Shift 43 取消注释 xff1a Ctrl 43 Shift 43 2 代码排
  • Qt之实现移动的方块(蚂蚁线)

    一 简介 移动的小方块或者说是类似移动的蚂蚁线 xff0c 从一篇文章看到的 xff0c 挺有趣的就自己做了一个 xff0c 可以自由添加方块的个数 xff0c 起始位置 xff0c 方块的宽度 xff0c 方块移动速度等待参数 xff0c