目录

一、需求分析

二、软件设计

框架设计

流程设计

关键算法


本文从头开发教你开发一个带滚动效果的抽奖软件。最终效果如下:

源码在文章最后

软件开发的第一步是需求分析,其实好的开发人员就是半个产品经理,我相信很多开发者都被产品经理坑过,需求一变再变,所以我们要在开发之前就把需求问清楚,越细越完善越好,尤其是面对领导编程的时候更加需要把需求明确下来。

正确的方向才会得到正确的结果,错误的方向再怎么努力也不会有好的结果。

一、需求分析

不知道你遇到过这样的需求吗?通常是一句话,在这个抽奖软件中,客户也只是给了一句话:“我想要一个带滚动效果的抽奖,在晚会上面使用。”

如果只是满足他的这个一句话的需求,那么软件开发完成客户肯定不会满意。我们需要在开发之前确定一些隐藏的功能点。

例如:

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)相关推荐

  1. 解放前端工程师——手把手教你开发自己的自定义列表和自定义表单系列之二接口

    前言 阅读前请按照顺序参看系列文章,效果更佳! Vue中路由到一个公共组件,然后根据路径中是否存在文件动态加载组件 解放前端工程师--手把手教你开发自己的自定义列表和自定义表单系列之一缘起 据说系列文 ...

  2. java 注册探探账号_零基础手把手教你开发探探类社交软件Tinder

    原标题:零基础手把手教你开发探探类社交软件Tinder 目录介绍 1.关于项目App整体架构 1.1项目整体架构 1.1.1 目前项目使用架构 1.1.2 目前常见的架构 1.1.3 MVP架构优点及 ...

  3. 手把手教你开发photoshop面板插件(附demo和工具)

    手把手教你开发photoshop面板插件(附demo和工具) 一.前言 二.插件演示 三.目录文件介绍 3.1 插件安装 3.2 开启ps开发模式 3.3 插件文件介绍 3.4 manifest 文件 ...

  4. 手把手教你开发IOT设备

    手把手教你开发IOT设备 1.概述 IOT设备的开发是基于rt-thread rtos实现.rt-thread是一个国产RTOS,它是一个RTOS,但又不仅仅是RTOS,支持大量的芯片,驱动,还包含大 ...

  5. 手把手教你开发Pro/TOOLKIT应用程序(一)

    前言 本教程采用VS2008 + Pro/E Wildfire5.0来讲解怎样开发Pro/TOOLKIT应用程序. 开发Pro/TOOLKIT应用程序时,Pro/E和Visual Studio的版本需 ...

  6. 手把手教你开发chrome扩展一:开发Chrome Extenstion其实很简单

    手把手教你开发chrome扩展一:开发Chrome Extenstion其实很简单 参考地址为:手把手教你开发chrome扩展一:开发Chrome Extenstion其实很简单

  7. 物联网全栈教程--手把手教你开发一个智能浇花器

    下面来说一下课程的安排,本教程可以分为三大章节,30个小章节,在1-10章节,手把手讲解了如何实现一个定时/实时控制的浇花器,可以对浇花器电量进行显示,可以进行定时设置,以及实时控制,低功耗模式等等, ...

  8. 手把手教你开发微信小程序中的插件

    继上次 手把手教你实现微信小程序中的自定义组件 已经有一段时间了(不了解的小伙伴建议去看看,因为插件很多内容跟组件相似),今年3月13日,小程序新增了 小程序**「插件」 功能,以及开发者工具新增 「 ...

  9. 手把手教你开发enc424j600+Lwip以太网-送全部源码

    每个单片机爱好者以及嵌入式软件开发人员,都希望能够将设计的产品连入网络,在众多的网络通讯方式中,以太网是最经典,跨度最广的一种方式,它具备带宽大[100Mbps~1000Mbps],延时小[局域网达到 ...

  10. 手把手教你开发galgame 游戏(galgame 游戏引擎开发入门经典教程)

      首先要给大家说明的是:软件工程知识,就是利用好现有游戏引擎这样省时省力 比如吉利吉利系统就是开源免费的,做自己的引擎也是好主意,这样可以充分享受DIY的乐趣!   我最近回味魔兽学院 MAN AT ...

最新文章

  1. unittest 框架学习
  2. python使用方法-在Python中使用next()方法操作文件的教程
  3. 团队开发项目--校园知网 nabcd 需求分析
  4. 肝!一款基于 Python 语言的 Linux 资源监视器!
  5. Vue学习笔记进阶篇——Render函数
  6. 【Flink】Flink CDC 数据同步 【视频笔记】
  7. 【天池大数据赛题解析】资金流入流出预测(附Top4答辩ppt)
  8. Atitit it法学论 uke协会it刑法attilax总结 目录 1. 法学plus 1 1.1. 替换表 1 2. 第一章 刑法概说 1 2.1. 财产 1 3. Line 65: 第四章 犯
  9. 智力题----囚犯猜帽子问题
  10. 本地打印后台处理程序服务没有运行
  11. Cloudera-server迁移
  12. c语言 请编程序将 China 译成密码,分别用putchar和printf函数输出这5个字符
  13. 12面魔方公式图解法_魔方小站三级12面魔方教程拍个视频
  14. fiddler提示the system proxy was changed,Click to reanable capturing.导致无法抓包
  15. Python:fractions模块数值、浮点、小数转分数
  16. GridControl GridView 单元格内容换行
  17. C语言两分钟倒计时小程序
  18. matlab快速生成双峰函数
  19. 【排序】一次查找两元素
  20. win7设置wifi热点_Windows系统设置WIFI热点

热门文章

  1. 计算机考试系统客户端网址,[中学]计算机基础测评系统考试客户端操作步骤.doc...
  2. CSS权威指南 -- 第一章 CSS和文档
  3. 从Python.org下载Python安装包下载很慢
  4. 短信接口防盗刷解决方案
  5. 推荐15款免费的网页抓取软件
  6. 《JAVA程序设计基础(第3版)实验指导》pdf 附下载链接
  7. 群晖如何建php网站_群晖nas使用教程31:搭建个人网站ZBLOG
  8. 图片无损压缩软件哪个好用:试试完全免费的JPG-C 图片批量修整压缩减肥工具吧 | 最新jpg批量修整工具下载
  9. Linux系统批量压缩图片工具
  10. 新版本steam退回旧版本教程