Qt实现抽奖程序
一、简介
该程序命名为Lucky,实现的功能如下:
1. 加载抽奖人员名单,并保存加载路径;
2. 单击左键或者点击ctrl+s开始抽奖,并滚动显示人员名单,显示的人员名单格式为 部门-姓名。
3. 单击左键或者点击ctrl+s停止抽奖,并固定显示中奖人员名单。
工具:Qt5.13 + msvc2015
二、界面显示
①:滚动显示名单
②:抽奖开始/停止显示
③:名单路径及加载按钮
三、详解
抽奖程序,简单来说,需要有人员名单+抽奖功能,至于奖品,本程序未实现显示奖品的功能,只是一个简易的抽奖小程序。
3.1 加载名单并保存路径功能实现
使用QFileDialog::getOpenFileName()函数加载人员名单文件。
或者直接粘贴路径,利用QLineEdit的editingFinished信号获取到路径。
SaveSettings()函数把加载的文件路径保存下来,保存路径在luckySet.ini文件。使用QSettings类保存。
代码如下:
void Dialog::on_pushButton_openFile_clicked()
{
m_loadFile = QFileDialog::getOpenFileName(this,tr("选择文件"),QDir::currentPath(),QString("(*.txt *.csv)"));
if(m_loadFile.isEmpty())
{
QMessageBox::warning(this,tr("WARNING"),tr("NOT SELECT FILE"));
return;
}
ui->LineEdit_list->setText(m_loadFile);
SaveSettings();
} void Dialog::on_LineEdit_list_editingFinished()
{
m_loadFile = ui->LineEdit_list->text();
SaveSettings();
}
void Dialog::SaveSettings()
{
QSettings setting(m_iniFile,QSettings::IniFormat);
setting.setValue("path/path",m_loadFile);
}
3.2 抽奖功能实现
1.单击左键或者点击ctrl+s键开始/停止抽奖,需要使用Qt事件系统中的鼠标事件和键盘事件。重载mousePressEvent()和keyPressEvent()函数。
代码如下:
void Dialog::mousePressEvent(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton)//单击左键
{
SelectWinner();
}
}
void Dialog::keyPressEvent(QKeyEvent *event)
{
if(event->modifiers() == Qt::ControlModifier)//点击ctrl键
{
if(event->key() == Qt::Key_S)//点击s键
{
SelectWinner();
}
}
}
2.滚动名单每隔一定时间显示,需要使用Qt的定时器QTimer类实现。
定时器使用需要:
- setInterval()设定定时周期
- 绑定超时信号timeout()到自定义的槽函数
- 调用start()函数启动定时器
- 调用stop()函数停止定时器
构造函数部分代码如下:
timer1 = new QTimer(this);
connect(timer1,SIGNAL(timeout()),this,SLOT(onRangeChanged()));//
其中timer1在头文件中声明,onRangeChanged()是自定义的槽函数,代码如下:
void Dialog::onRangeChanged()
{
int num = m_listPerson.size();//人员名单个数
if(num == 0)//全部都中奖后重新加载名单开启第二轮抽奖
{
GetListFromFile(m_loadFile);
num = m_listPerson.size();
} winner = qrand()%num;
qDebug() << winner; m_strWinner = m_listPerson[winner].department + "-" + m_listPerson[winner].name;
ui->label_show->setText(m_strWinner);//显示部门+姓名
}
SelectWinner()函数设置定时器的开启和停止,代码如下:
void Dialog::SelectWinner()
{
if(("停止") == ui->label_run->text())
{
ui->label_run->setText("开始");
timer1->stop();
m_listPerson.remove(winner);
}
else
{
GetListFromFile(m_loadFile);
ui->label_run->setText("停止");
timer1->setInterval(150);
qsrand((uint)(QTime::currentTime().msec()));
qDebug() << "开始";
timer1->start();
}
ui->label_show->setText(m_strWinner);
}
GetListFromFile()函数从文件中获取到名单列表,代码如下:
void Dialog::GetListFromFile(const QString &file)
{
QFile csvFile(file);
if(!csvFile.open(QIODevice::Text | QIODevice::ReadOnly))
{
QMessageBox::warning(this,tr("WARNING"),tr("OPEN FILE ERROR"));
return ;
}
QTextStream textStream(&csvFile);
QTextCodec* codec = QTextCodec::codecForName("GBK");
textStream.setCodec(codec);
QString strHeader = textStream.readLine();
QString strLine = textStream.readLine();
T_ListofPerson person;
while (!strLine.isEmpty()) { QStringList strList = strLine.split(",");
person.number = strList.at(0);
person.name = strList.at(1);
person.department = strList.at(2); m_listPerson.push_back(person);
strLine = textStream.readLine();
}
csvFile.close();
}
3.3 其它
程序打开加载路径,使用LoadSettings()函数实现,在构造函数中添加如下:
m_iniFile = "luckySet.ini";
m_loadFile = ".csv";
LoadSettings();
ui->LineEdit_list->setText(m_loadFile);
LoadSettings()实现如下:
void Dialog::LoadSettings()
{
QSettings setting(m_iniFile,QSettings::IniFormat);
m_loadFile = setting.value("path/path").toString();
}
四、总结
总结下来,本程序用到的点有:
- 定时器
- 事件系统
- 随机数
- QSettings类使用
- 文件操作
其中最重要的是定时器及随机数的使用。
详细代码地址:https://download.csdn.net/download/sinat_41752325/15416138
参考:https://blog.csdn.net/m0_37907070/article/details/72843132
不足之处请指出,不胜感激!!!
Qt实现抽奖程序的更多相关文章
- 使用jQuery+PHP+Mysql实现抽奖程序
抽奖程序在实际生活中广泛运用,由于应用场景不同抽奖的方式也是多种多样的.本文将采用实例讲解如何利用jQuery+PHP+Mysql实现类似电视中常见的一个简单的抽奖程序. 查看演示 本例中的抽奖程序要 ...
- jQuery幸运大转盘_jQuery+PHP抽奖程序的简单实现
jQuery幸运大转盘_jQuery+PHP抽奖程序的简单实现 在线实例 查看演示 完整代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 ...
- .net+mssql制作抽奖程序思路及源码
近期一直在研究数据库,刚好有个项目要做抽奖程序,恩,拿来练练手吧. 抽奖程序: 思路整理,无非就是点一个按钮,然后一个图片旋转一会就出来个结果就行了,可这个程序的要求不是这样的,是需要从数据库中随机抽 ...
- Qt for Android 程序禁止屏幕旋转
有时候我们希望让一个程序的界面始终保持在一个方向,不随手机(平板)方向旋转而变化:在AndroidManifest.xml的每一个需要禁止转向的Activity配置中加入 android:screen ...
- QT源码解析(一) QT创建窗口程序、消息循环和WinMain函数
QT源码解析(一) QT创建窗口程序.消息循环和WinMain函数 分类: QT2009-10-28 13:33 17695人阅读 评论(13) 收藏 举报 qtapplicationwindowse ...
- 一个好玩的jq+php实现转盘抽奖程序
前台页面: <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <met ...
- 幸运大转盘-jQuery+PHP实现的抽奖程序
目前好多网站上应用的转盘抽奖程序大多是基于flash的,而本文结合实例将使用jQuery和PHP来实现转盘抽奖程序,为了便于理解,作者分两部分来讲解,本文讲解第一部分,侧重使用jQuery实现转盘的转 ...
- 简单的javascript抽奖程序
<html> <head> <title>手机号码抽奖程序</title> <script> //声明一个数组装住号码,可根 ...
- iOS抽奖程序
iOS抽奖程序 代码下载地址: http://vdisk.weibo.com/s/HKehU http://pan.baidu.com/share/link?shareid=893330225& ...
- java模拟一个抽奖程序
今天用一个程序模拟一个从1-32之间,随机抽取7组号码的抽奖程序 * 需要使用Java的图形界面知识 * 窗口 JFrame * 面板 JPanel * 显示文本信息的标签 JLabel * 文 ...
随机推荐
- 【开源】libinimini:适用于单片机的极简 ini 解析库
介绍说明 最近自己基于 XR872 在做一个小作品练习练习,具备可以配置的功能,选择了使用 ini 作为配置文件.我调研了网上常见的 ini 解析库,几乎都涉及到了 fopen()/fgets().. ...
- 【学习笔记】QT从入门到实战完整版(按钮和信号槽)(1)
介绍说明 学习 QT 的目的只是为了可以实现跨平台的具有GUI 的程序,以前用的 MFC,但是无法应用在嵌入式平台.后来在全志的 Tina 系统中有看到 QT ,因此特地去了解了QT,挺有意思的,UI ...
- MySQL 如何实现数据更新
一般在更新时会遇到以下场景:1.所有字段全部更新:2.根据条件更新字段中的某部分内容:3.根据不同的条件更新不同的值,以下是几种场景中常用的update方法. 一.方法分类 二.具体用法 (1)根据条 ...
- Python源文件的编码
Python源文件的编码 入门教程->2.2.1 源文件的字符编码 参考官网:https://docs.python.org/zh-cn/3.9/tutorial/interpreter.htm ...
- logback日志输出到mongodb
1.继承UnsynchronizedAppenderBase package com.xf.config; import java.util.Map; import org.springframewo ...
- 单词检索(search)
单词检索(search) \(Description\) 小可可是学校图书馆的管理员,现在他接手了一个十分棘手的任务. 由于学校需要一些材料,校长需要在文章中检索一些信息.校长一共给了小可可N篇文章, ...
- 使用 Three.js 的 3D 制作动画场景
推荐:将 NSDT场景编辑器 加入你的3D开发工具链. 由于 GSL 语法的复杂性,对于许多开发人员来说 WebGL 是一个未知的领域.但是有了 Three.js,在浏览器中 3D 的实现变得简单.下 ...
- echart折线图异常多出一条连接线
开发背景:vue3父传子,父中调子组件echarts图表 问题:第一次进入数据图表正常,再次进入不更新图表数据的情况下,图表异常多出来一条开始到结尾的连接线 原因:上次数据没清空 解决:请求完接口后先 ...
- Apache HttpClient使用和源码分析
在上文中分析了 HttpURLConnection的用法,功能还是比较简单的,没有什么封装 接下来看看Apache HttpClient是如何封装httpClient的 目录 组成 请求代码 代码分析 ...
- 结合ChatGPT体验新必应new bing 的惊喜:这是我第一次使用的感受
前言 最近相信大家都被 ChatGPT 刷屏了,它的爆火大家是有目共睹的,微软的新必应(New Bing) 是结合了比 ChatGPT 更强大的新一代 OpenAI 语言模式,接下来我们一起来&quo ...