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 * 文 ...
随机推荐
- 【随笔记】Littlevgl 8.x 踩过的坑
在多线程并发使用的时候,总是在运行过程中莫名其妙的 crash,后面才意识到 LVGL 本身不支持并发,加了互斥锁解决了. 在引入矢量字库时(freetype),又有启动时会概率性 crash 的问题 ...
- SQLSERVER 的 truncate 和 delete 有区别吗?
一:背景 1. 讲故事 在面试中我相信有很多朋友会被问到 truncate 和 delete 有什么区别 ,这是一个很有意思的话题,本篇我就试着来回答一下,如果下次大家遇到这类问题,我的答案应该可以帮 ...
- java应用定位高cpu占用几步操作
1.top获取高cpu占用的pid,如266202.查看pid的线程情况, top -H -p 266203.把cpu高占用的线程号转为16进制,printf "%x" 26652 ...
- 基于遗传算法的地图四色原理绘图上色的Python代码
本文介绍利用Python语言,实现基于遗传算法(GA)的地图四色原理着色操作. 1 任务需求 首先,我们来明确一下本文所需实现的需求. 现有一个由多个小图斑组成的矢量图层,如下图所示. ...
- websocket-sharp 实现websocket
第一步,使用VS创建一个应用程序 第二步,添加引用 websocket-sharp DLL文件,或者NuGet程序包中添加 第三部,创建Laputa 类 using WebSocketSharp; u ...
- Spring(认识、IOC的开发过程、创建bean的方式)
spring框架(spring全家桶) spring FrameWork springBoot+springCloud+springCloud Data Flow 一:spring的两大核心机制: I ...
- 推荐一个分布式单点登录框架XXL-SSO!
有关单点登录(SSO)之前有写过两篇文章 一文读懂 JWT! 看完这篇不能再说不懂SSO原理了! 如果说XXL-JOB你可能并不陌生,它是非常火爆的一个分布式任务调度平台.但其实在该作者还有一个非常优 ...
- jsHtml解码
//将HTML代码转换为文本 function HTMLDecode(text) { var temp = document.createElement("div"); temp. ...
- 一个基于 gin+ grpc + etcd 等框架开发的小栗子
一.标准的项目结构 首先我们看一个标准的项目结构是什么样子的,github 上给出的一个示例:golang-standards/project-layout 二.服务注册与发现流程 三.示例代码 项目 ...
- vue-fullpage全屏插件使用
直入主题:vue项目中想做一个全屏翻滚的效果,vue-fullpage 就很不错 下面介绍vue-fullpage 的使用方法,这里封装成了vue的一个指令的形式来进行使用 1.安装vue-fullp ...