最近琢磨着搞个小程序,正好手头在用Qt,就想着能不能做一个抽奖的玩意儿。有时候搞活动或者年会啥的能用上,或者就是纯粹练练手。
开工准备
第一步嘛肯定是在Qt Creator里头新建一个项目。我就选最基础的那个,带界面的,叫啥QtWidgets Application来着。名字就随便起个,比如"LotteryApp"之类的,路径选编译器啥的默认就行,一路点下去,项目框架就出来。
界面设计
接着就是画界面。Qt这个直接拖控件就行。我寻思着,抽奖嘛总得有个地方显示滚动的名字和中奖的人?拖个大大的标签(QLabel)放中间。然后得有按钮控制开始和停止,就放俩按钮(QPushButton),一个叫“开始抽奖”,一个叫“停!”。后来想想,人名从哪来?总不能写死在代码里,太傻。于是又加个按钮,叫“加载名单”,再加个小标签,用来显示加载的文件路径或者加载多少人,心里有个数。
大概布局就是:
- 顶部一个标签显示文件信息。
- 中间一个大标签显示滚动的名字和结果。
- 底部三个按钮:“加载名单”、“开始抽奖”、“停!”。
用自带的布局管理器稍微排列下,让它们别乱跑,看着整齐点就行。
加载人名
界面有,得让它能干活。先解决人名来源问题。点击“加载名单”按钮,应该弹出一个文件选择框。我查下,Qt里有个叫QFileDialog
的玩意儿,正好能用。用它拿到用户选的文本文件(比如一个txt,每行一个人名,或者名字加部门用逗号隔开)。
拿到文件路径后,就得读取文件内容。用QFile
打开文件,再用QTextStream
一行一行地读。读出来的每一行(去掉前后空格)就是一个参与者,把这些人名都存到一个列表里,比如QStringList
,方便后面随机抽取。
加载完,最好在界面上那个小标签里提示一下,比如“成功加载XX人名单”。这样用户就知道加载成功。
抽奖逻辑
这是核心部分。点击“开始抽奖”按钮后,得让中间那个大标签里的名字快速滚动起来,看着有抽奖的气氛。
滚动效果:这个我用个定时器QTimer
。点击“开始抽奖”按钮,就启动这个定时器,比如每隔50毫秒或者100毫秒触发一次。每次触发,就从人名列表里随机选一个名字(用qrand()
或者新的QRandomGenerator
生成随机数,然后用这个随机数当索引去列表里取名字),更新到那个大标签上。这样名字就会不停地快速变化,看起来就像在滚动。
停止抽奖:点击“停!”按钮,就把定时器停掉。定时器一停,标签上的名字就不再变化,当前显示的名字就是中奖者。
为防止重复中奖(如果需要的话),可以在抽中一个人后,把他从那个QStringList
列表里删掉。这样下次滚动和抽取就不会再有他。
小优化
后来实际跑跑,发现几个小问题:
- 如果名单加载失败,没提示,用户不知道咋回事。我就加些判断,如果文件打不开或者内容是空的,就弹个消息框提示一下。
- 开始和停止用一个按钮会不会更方便?试下,也行。按钮初始文字是“开始抽奖”,点击后启动定时器,按钮文字变成“停止”。再次点击,停止定时器,按钮文字变回“开始抽奖”。这样少一个按钮,界面更简洁点。
- 加个“重置”功能,有时候抽一轮想重新开始,点一下“重置”就把之前从列表里删掉的人名加回来,恢复到最初加载的状态。
最终效果
捣鼓半天,总算是弄出来。运行起来,可以加载TXT文件里的人名,点击开始按钮名字哗哗地滚动,再点一下就停住,显示中奖人。虽然界面简陋,功能也简单,但基本流程是走通。自己搞活动或者班级里用用是足够。
用Qt做这个还挺顺手的,自带的类库帮不少忙,不用自己造太多轮子。这回实践也算是把文件读写、定时器、随机数、界面交互这些基础操作又过一遍,挺