手把手教你开发-滚动效果号码抽奖(QT)
目录
一、需求分析
二、软件设计
框架设计
流程设计
关键算法
本文从头开发教你开发一个带滚动效果的抽奖软件。最终效果如下:
源码在文章最后
软件开发的第一步是需求分析,其实好的开发人员就是半个产品经理,我相信很多开发者都被产品经理坑过,需求一变再变,所以我们要在开发之前就把需求问清楚,越细越完善越好,尤其是面对领导编程的时候更加需要把需求明确下来。
正确的方向才会得到正确的结果,错误的方向再怎么努力也不会有好的结果。
一、需求分析
不知道你遇到过这样的需求吗?通常是一句话,在这个抽奖软件中,客户也只是给了一句话:“我想要一个带滚动效果的抽奖,在晚会上面使用。”
如果只是满足他的这个一句话的需求,那么软件开发完成客户肯定不会满意。我们需要在开发之前确定一些隐藏的功能点。
例如:
1、需不需要音乐?背景音乐和滚动音乐。
这个项目案例中未开发,但是实际场景中肯定是需要的。
2、抽奖的触发方式是什么?有没有额外的硬件按钮、鼠标控制还是键盘控制。
这个项目案例未开发,但是实际场景中可以需要适配硬件按钮,蓝牙或者无线等通信触发。
3、需要不需要指定中将号码?
开发过抽奖的软件的工程师一般都不会相信所谓的抽奖软件了。
项目中开发了该功能。
4、需要不需要将抽奖数据保存在文件中?
这个功能是肯定需要的,项目中预留的保存数据接口。
5、字体颜色会随时改变吗?
使用过程中,客户有时候会喜欢改变字体颜色显得更加高大上,尤其是户外的显示屏的颜色和开发过程中的效果可能不一样,因此可能需要针对具体的显示屏和环境进行调整背景图片以及颜色。
项目中预留了颜色调整的接口。
二、软件设计
有了需求其实就可以针对需求进行设计。
框架设计
软件框架图如下:
RollingLotteryView : 抽奖窗口类,主要管理抽奖停止循序,已经抽奖的背景图等。
NumItem:抽奖号码类,每个抽奖号码的管理,号码滚动效果都在这里类中完成。
接口:
接口 | 说明 |
setItemBackground(QImage img) |
设置每一个抽奖号码的背景 |
bool setItemColor(QColor color) |
设置抽奖号码的颜色 |
bool setBackground(QImage img) |
设置整体的大背景图 |
void start() |
开始抽奖 |
void stop(int res=-1) | 结束抽奖,如果设置数据那么会在指定的数据下停止 |
void sigStop(int num) |
信号,抽奖结束后会触发该信号, 用户可以通过绑定该信号获取抽奖结果 |
流程设计
用户调用start接口,触发每一个num_item的定时器,然后让每一个号码转动起来。启动流程如下:
暂停流程比较复杂,因为需要逐个停止,因此每一个停止之后需要告诉主页面触发下一个号码的停止,流程图如下:
关键算法
void NumItem::on_timer_timeout()
{// 数字号码的高度。m_height += 5;QFont qf;qf.setPointSize(2);qf.setPixelSize(100);QFontMetrics qfm(qf);int b = qfm.height(); // 计算字高// 当移动高度大于字体高度的时候认为该字体已经被隐藏掉了if (m_height > b) {m_height = m_height % b;// 数字循环if (m_num == 0) {m_num = 9;}else {m_num--;} if (!m_status) {// 是否指定了结果,如果指定结果那么就行等到指定的结果才停止。if(m_resNum == -1){sigStop(m_num);m_timer->stop();}else if(m_resNum == m_num){sigStop(m_num);m_timer->stop();}}}update();
}
void NumItem::paintEvent(QPaintEvent *)
{QPainter p(this);QFont qf;QPen pen(m_color);p.setPen(pen);qf.setPointSize(2);qf.setPixelSize(100);QFontMetrics qfm(qf);int a = qfm.width("1");int b = qfm.height();p.setFont(qf);// 由于要做滚动效果,因此需要画两个字// 由于高度不断的变高,那么呈现出滚动的效果。p.drawText(0, m_height, a, b, 1, QString::number(m_num));p.drawText(0, m_height - b, a, b, 1, QString::number(m_num - 1));if (m_imgBackground.isNull()) {return;}QPainter painter(this);QRect target(0, 0, this->size().width(), this->size().height());painter.drawImage(target, m_imgBackground);
}
QT使用F11全屏展示
git源码传送门
手把手教你开发-滚动效果号码抽奖(QT)相关推荐
- 解放前端工程师——手把手教你开发自己的自定义列表和自定义表单系列之二接口
前言 阅读前请按照顺序参看系列文章,效果更佳! Vue中路由到一个公共组件,然后根据路径中是否存在文件动态加载组件 解放前端工程师--手把手教你开发自己的自定义列表和自定义表单系列之一缘起 据说系列文 ...
- java 注册探探账号_零基础手把手教你开发探探类社交软件Tinder
原标题:零基础手把手教你开发探探类社交软件Tinder 目录介绍 1.关于项目App整体架构 1.1项目整体架构 1.1.1 目前项目使用架构 1.1.2 目前常见的架构 1.1.3 MVP架构优点及 ...
- 手把手教你开发photoshop面板插件(附demo和工具)
手把手教你开发photoshop面板插件(附demo和工具) 一.前言 二.插件演示 三.目录文件介绍 3.1 插件安装 3.2 开启ps开发模式 3.3 插件文件介绍 3.4 manifest 文件 ...
- 手把手教你开发IOT设备
手把手教你开发IOT设备 1.概述 IOT设备的开发是基于rt-thread rtos实现.rt-thread是一个国产RTOS,它是一个RTOS,但又不仅仅是RTOS,支持大量的芯片,驱动,还包含大 ...
- 手把手教你开发Pro/TOOLKIT应用程序(一)
前言 本教程采用VS2008 + Pro/E Wildfire5.0来讲解怎样开发Pro/TOOLKIT应用程序. 开发Pro/TOOLKIT应用程序时,Pro/E和Visual Studio的版本需 ...
- 手把手教你开发chrome扩展一:开发Chrome Extenstion其实很简单
手把手教你开发chrome扩展一:开发Chrome Extenstion其实很简单 参考地址为:手把手教你开发chrome扩展一:开发Chrome Extenstion其实很简单
- 物联网全栈教程--手把手教你开发一个智能浇花器
下面来说一下课程的安排,本教程可以分为三大章节,30个小章节,在1-10章节,手把手讲解了如何实现一个定时/实时控制的浇花器,可以对浇花器电量进行显示,可以进行定时设置,以及实时控制,低功耗模式等等, ...
- 手把手教你开发微信小程序中的插件
继上次 手把手教你实现微信小程序中的自定义组件 已经有一段时间了(不了解的小伙伴建议去看看,因为插件很多内容跟组件相似),今年3月13日,小程序新增了 小程序**「插件」 功能,以及开发者工具新增 「 ...
- 手把手教你开发enc424j600+Lwip以太网-送全部源码
每个单片机爱好者以及嵌入式软件开发人员,都希望能够将设计的产品连入网络,在众多的网络通讯方式中,以太网是最经典,跨度最广的一种方式,它具备带宽大[100Mbps~1000Mbps],延时小[局域网达到 ...
- 手把手教你开发galgame 游戏(galgame 游戏引擎开发入门经典教程)
首先要给大家说明的是:软件工程知识,就是利用好现有游戏引擎这样省时省力 比如吉利吉利系统就是开源免费的,做自己的引擎也是好主意,这样可以充分享受DIY的乐趣! 我最近回味魔兽学院 MAN AT ...
最新文章
- unittest 框架学习
- python使用方法-在Python中使用next()方法操作文件的教程
- 团队开发项目--校园知网 nabcd 需求分析
- 肝!一款基于 Python 语言的 Linux 资源监视器!
- Vue学习笔记进阶篇——Render函数
- 【Flink】Flink CDC 数据同步 【视频笔记】
- 【天池大数据赛题解析】资金流入流出预测(附Top4答辩ppt)
- Atitit it法学论 uke协会it刑法attilax总结 目录 1. 法学plus	1 1.1. 替换表	1 2. 第一章 刑法概说	1 2.1. 财产	1 3. Line 65: 第四章 犯
- 智力题----囚犯猜帽子问题
- 本地打印后台处理程序服务没有运行
- Cloudera-server迁移
- c语言 请编程序将 China 译成密码,分别用putchar和printf函数输出这5个字符
- 12面魔方公式图解法_魔方小站三级12面魔方教程拍个视频
- fiddler提示the system proxy was changed,Click to reanable capturing.导致无法抓包
- Python:fractions模块数值、浮点、小数转分数
- GridControl GridView 单元格内容换行
- C语言两分钟倒计时小程序
- matlab快速生成双峰函数
- 【排序】一次查找两元素
- win7设置wifi热点_Windows系统设置WIFI热点
热门文章
- 计算机考试系统客户端网址,[中学]计算机基础测评系统考试客户端操作步骤.doc...
- CSS权威指南 -- 第一章 CSS和文档
- 从Python.org下载Python安装包下载很慢
- 短信接口防盗刷解决方案
- 推荐15款免费的网页抓取软件
- 《JAVA程序设计基础(第3版)实验指导》pdf 附下载链接
- 群晖如何建php网站_群晖nas使用教程31:搭建个人网站ZBLOG
- 图片无损压缩软件哪个好用:试试完全免费的JPG-C 图片批量修整压缩减肥工具吧 | 最新jpg批量修整工具下载
- Linux系统批量压缩图片工具
- 新版本steam退回旧版本教程