一、简介

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

效果图

二、代码之路

AntsLineWidget.h

#pragma once#include <QtWidgets/QWidget>
#include <QTimer>class AntsLineWidget : public QWidget
{Q_OBJECTpublic: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 20AntsLineWidget::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进行下载,更多好玩,有趣的在等着你 ^ _ ^

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

  1. Qt实战(二)——方块游戏

    方块游戏架构   在这个游戏中,有一个区域用来摆放方块,该区域宽为10,高为20,以小正方形为单位,它可以看作是拥有20行10列的一个网格.标准的游戏中一共有7种方块,它们都是由4个小正方形组成的规则 ...

  2. QT 小游戏 : 别踩白块儿~

    一.实现思路 QPainter 绘制 游戏界面 PS:根据方块坐标链表绘制所有方块 支持两种操作方式 PS:鼠标事件 和 键盘事件(Q,W,E,R,T) 定时器(10ms) 刷新 方块坐标数据 根据得 ...

  3. qt在表格中如何画线_Qt之表格控件蚂蚁线

    阅读目录 回到顶部 一.蚂蚁线 摘自互动百科:在图像影像软件中表示选区的动态虚线,因为虚线闪烁的样子像是一群蚂蚁在跑,所以俗称蚂蚁线.在Poshop,After Effect等软件中比较常见. 背景: ...

  4. 搭建Qt 5.3.1 for Windows Phone 8开发环境

    目前Qt已经支持了Android以及iOS的开发,我也亲自尝试过在Android和iOS上的开发,其中在Android这一块研究的较深,也制作出了第一款独立游戏<吃药了>.在Qt的新版本5 ...

  5. QT 定时器与动画实现

    前言 Qt提供图形视图框架(Graphics View Framework).动画框架(The Animation Framework)和状态机框架(The State Machine Framewo ...

  6. 【Qt】2D绘图之图形视图框架(一)

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 场景(Scene) 04. 视图(View) 05. 图形项 06. 附录 01. 概述 在前面讲的基本绘图中,我们可以自 ...

  7. [Qt教程] 第19篇 2D绘图(九)图形视图框架(上)

    [Qt教程] 第19篇 2D绘图(九)图形视图框架(上) 楼主  发表于 2013-5-4 15:26:20 | 查看: 1798| 回复: 26 图形视图框架(上) 版权声明 导语 在前面讲的基本绘 ...

  8. qt登录界面跳转_每天10分钟,木辛老师带你实战慕课软件开发:登录界面开发第2课...

    软件实战开始,快速提供编程能力:通过实战,分析产品需求,梳理设计需求,提升项目分析和架构的能力.快点跟着木辛老师一起学习吧! 请点击右上角"关注"按钮关注我们哟:跟着木辛老师学习P ...

  9. C++与Qt开发人机象棋(第二部分)

    C++与Qt开发人机象棋(第二部分) 项目目录 文件名->(包含)类名1->(包含)类名2 ChessBy ChessBy.pro Headers Board.h – – – Source ...

最新文章

  1. Yii 1.1.4发布,高性能的PHP框架
  2. OpenGL 距离场美化实例
  3. c primer plus(第五版)读书笔计 第二章(3)
  4. java城市级联一次查询_我的城市没有任何设计活动,所以我自己组织了一次。...
  5. [react] 使用高阶组件(HOC)实现一个loading组件
  6. 使用Spark Streaming SQL基于时间窗口进行数据统计
  7. 惊艳的HTML5粒子动画特效
  8. php 函数漏洞,PHP绕过禁用函数漏洞的原理与利用分析
  9. ubuntu 16.04 安装samba
  10. L1-022. 奇偶分家-PAT团体程序设计天梯赛GPLT
  11. qdialog 只有点击才能获得焦点_张怡筠:怎么做,孩子才能真正爱上学习?
  12. 什么是递归?递归的理解
  13. win7使用笔记本做wifi热点
  14. 2020年5月面试精心整理java面试题,覆盖了大部分面试题(附答案)
  15. MRI数据预处理--使用FSL-BET轻松去头骨,提取脑组织
  16. 删除字符串某一指定子字符串
  17. 招投标小程序开发功能及源码
  18. 山东地图echarts js文件
  19. 计算机毕业设计Java大学生闲置物品拍卖系统(源码+系统+mysql数据库+lw文档
  20. SSM家庭理财个人理财系统-JAVA【数据库设计、源码、开题报告】

热门文章

  1. 用C#进行北斗串口编程之一:获取北斗卡号
  2. 软件项目管理期末复习--项目过程模型
  3. Golang实现Windows的TTS实现文本转语音
  4. FreeCAD - 您专属的3D参数化建模工具
  5. 分治法的计算时间、时间复杂度推导以及经典算法分析
  6. Unable to start docker Container from docker-compose “unknown flag: iidfile”
  7. Jeecg-Boot 前端读入 excel
  8. 进阶 c程序设计语言,C程序设计进阶
  9. 关于 Vue “__ob__:Observer“ 属性的解决方案
  10. 2014年北邮软院机试