Qt之实现移动的方块(蚂蚁线)
一、简介
移动的小方块或者说是类似移动的蚂蚁线,从一篇文章看到的,挺有趣的就自己做了一个,可以自由添加方块的个数,起始位置,方块的宽度,方块移动速度等待参数,下方是实现的代码,如果有需要新增的参数可以自行添加。
效果图
二、代码之路
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之实现移动的方块(蚂蚁线)相关推荐
- Qt实战(二)——方块游戏
方块游戏架构 在这个游戏中,有一个区域用来摆放方块,该区域宽为10,高为20,以小正方形为单位,它可以看作是拥有20行10列的一个网格.标准的游戏中一共有7种方块,它们都是由4个小正方形组成的规则 ...
- QT 小游戏 : 别踩白块儿~
一.实现思路 QPainter 绘制 游戏界面 PS:根据方块坐标链表绘制所有方块 支持两种操作方式 PS:鼠标事件 和 键盘事件(Q,W,E,R,T) 定时器(10ms) 刷新 方块坐标数据 根据得 ...
- qt在表格中如何画线_Qt之表格控件蚂蚁线
阅读目录 回到顶部 一.蚂蚁线 摘自互动百科:在图像影像软件中表示选区的动态虚线,因为虚线闪烁的样子像是一群蚂蚁在跑,所以俗称蚂蚁线.在Poshop,After Effect等软件中比较常见. 背景: ...
- 搭建Qt 5.3.1 for Windows Phone 8开发环境
目前Qt已经支持了Android以及iOS的开发,我也亲自尝试过在Android和iOS上的开发,其中在Android这一块研究的较深,也制作出了第一款独立游戏<吃药了>.在Qt的新版本5 ...
- QT 定时器与动画实现
前言 Qt提供图形视图框架(Graphics View Framework).动画框架(The Animation Framework)和状态机框架(The State Machine Framewo ...
- 【Qt】2D绘图之图形视图框架(一)
00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 场景(Scene) 04. 视图(View) 05. 图形项 06. 附录 01. 概述 在前面讲的基本绘图中,我们可以自 ...
- [Qt教程] 第19篇 2D绘图(九)图形视图框架(上)
[Qt教程] 第19篇 2D绘图(九)图形视图框架(上) 楼主 发表于 2013-5-4 15:26:20 | 查看: 1798| 回复: 26 图形视图框架(上) 版权声明 导语 在前面讲的基本绘 ...
- qt登录界面跳转_每天10分钟,木辛老师带你实战慕课软件开发:登录界面开发第2课...
软件实战开始,快速提供编程能力:通过实战,分析产品需求,梳理设计需求,提升项目分析和架构的能力.快点跟着木辛老师一起学习吧! 请点击右上角"关注"按钮关注我们哟:跟着木辛老师学习P ...
- C++与Qt开发人机象棋(第二部分)
C++与Qt开发人机象棋(第二部分) 项目目录 文件名->(包含)类名1->(包含)类名2 ChessBy ChessBy.pro Headers Board.h – – – Source ...
最新文章
- Yii 1.1.4发布,高性能的PHP框架
- OpenGL 距离场美化实例
- c primer plus(第五版)读书笔计 第二章(3)
- java城市级联一次查询_我的城市没有任何设计活动,所以我自己组织了一次。...
- [react] 使用高阶组件(HOC)实现一个loading组件
- 使用Spark Streaming SQL基于时间窗口进行数据统计
- 惊艳的HTML5粒子动画特效
- php 函数漏洞,PHP绕过禁用函数漏洞的原理与利用分析
- ubuntu 16.04 安装samba
- L1-022. 奇偶分家-PAT团体程序设计天梯赛GPLT
- qdialog 只有点击才能获得焦点_张怡筠:怎么做,孩子才能真正爱上学习?
- 什么是递归?递归的理解
- win7使用笔记本做wifi热点
- 2020年5月面试精心整理java面试题,覆盖了大部分面试题(附答案)
- MRI数据预处理--使用FSL-BET轻松去头骨,提取脑组织
- 删除字符串某一指定子字符串
- 招投标小程序开发功能及源码
- 山东地图echarts js文件
- 计算机毕业设计Java大学生闲置物品拍卖系统(源码+系统+mysql数据库+lw文档
- SSM家庭理财个人理财系统-JAVA【数据库设计、源码、开题报告】
热门文章
- 用C#进行北斗串口编程之一:获取北斗卡号
- 软件项目管理期末复习--项目过程模型
- Golang实现Windows的TTS实现文本转语音
- FreeCAD - 您专属的3D参数化建模工具
- 分治法的计算时间、时间复杂度推导以及经典算法分析
- Unable to start docker Container from docker-compose “unknown flag: iidfile”
- Jeecg-Boot 前端读入 excel
- 进阶 c程序设计语言,C程序设计进阶
- 关于 Vue “__ob__:Observer“ 属性的解决方案
- 2014年北邮软院机试