一、简介

该程序命名为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();
}

四、总结

总结下来,本程序用到的点有:

  1. 定时器
  2. 事件系统
  3. 随机数
  4. QSettings类使用
  5. 文件操作

其中最重要的是定时器及随机数的使用。

详细代码地址:https://download.csdn.net/download/sinat_41752325/15416138

参考:https://blog.csdn.net/m0_37907070/article/details/72843132

不足之处请指出,不胜感激!!!

Qt实现抽奖程序的更多相关文章

  1. 使用jQuery+PHP+Mysql实现抽奖程序

    抽奖程序在实际生活中广泛运用,由于应用场景不同抽奖的方式也是多种多样的.本文将采用实例讲解如何利用jQuery+PHP+Mysql实现类似电视中常见的一个简单的抽奖程序. 查看演示 本例中的抽奖程序要 ...

  2. jQuery幸运大转盘_jQuery+PHP抽奖程序的简单实现

    jQuery幸运大转盘_jQuery+PHP抽奖程序的简单实现 在线实例 查看演示 完整代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 ...

  3. .net+mssql制作抽奖程序思路及源码

    近期一直在研究数据库,刚好有个项目要做抽奖程序,恩,拿来练练手吧. 抽奖程序: 思路整理,无非就是点一个按钮,然后一个图片旋转一会就出来个结果就行了,可这个程序的要求不是这样的,是需要从数据库中随机抽 ...

  4. Qt for Android 程序禁止屏幕旋转

    有时候我们希望让一个程序的界面始终保持在一个方向,不随手机(平板)方向旋转而变化:在AndroidManifest.xml的每一个需要禁止转向的Activity配置中加入 android:screen ...

  5. QT源码解析(一) QT创建窗口程序、消息循环和WinMain函数

    QT源码解析(一) QT创建窗口程序.消息循环和WinMain函数 分类: QT2009-10-28 13:33 17695人阅读 评论(13) 收藏 举报 qtapplicationwindowse ...

  6. 一个好玩的jq+php实现转盘抽奖程序

    前台页面: <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <met ...

  7. 幸运大转盘-jQuery+PHP实现的抽奖程序

    目前好多网站上应用的转盘抽奖程序大多是基于flash的,而本文结合实例将使用jQuery和PHP来实现转盘抽奖程序,为了便于理解,作者分两部分来讲解,本文讲解第一部分,侧重使用jQuery实现转盘的转 ...

  8. 简单的javascript抽奖程序

    <html>  <head>   <title>手机号码抽奖程序</title>   <script>    //声明一个数组装住号码,可根 ...

  9. iOS抽奖程序

    iOS抽奖程序 代码下载地址: http://vdisk.weibo.com/s/HKehU http://pan.baidu.com/share/link?shareid=893330225& ...

  10. java模拟一个抽奖程序

    今天用一个程序模拟一个从1-32之间,随机抽取7组号码的抽奖程序 * 需要使用Java的图形界面知识 * 窗口  JFrame * 面板  JPanel * 显示文本信息的标签  JLabel * 文 ...

随机推荐

  1. Quartz.Net 官方教程 Tutorial 2/3(Listener 和 JobStore)

    Listener 调度任务的监听,当前版本支持添加调度,触发器和任务的监听,其中触发器和任务的监听支持通过监听名称进行添加(Add*ListenerMatcher方法) 监听不能对外抛出异常,需要内部 ...

  2. 【Android】移除 Android frameworks 层,当 Linux 系统使用。(服务移除篇)

    前言说明 此文章仅作为技术经验记录,核心思想,就是在 init.rc 里面移除服务,致使 frameworks 不被启动,其它不便多说. 此文章内容为系统服务移除篇,最终实现的效果是 Android ...

  3. spring注入静态变量有几种方法?不看的都掉坑里了!

    springboot中经常会用到properties文件中的配置,一般使用@Value注入,但是针对Utils工具类,需要注入一个静态变量有几种方法?为什么有的同学注入的值为null? 代码示例 如果 ...

  4. you-get下载B站视频

    you-get下载B站视频 库存 you-get介绍 https://github.com/soimort/you-get you-get是一个命令行工具,可以下载知名网站的视频 支持的网站有  ht ...

  5. YonBuilder移动开发平台App拉起第三方应用

    在App的开发过程中,有一种常见场景,就是拉起第三方app,那么使用YonBuilder移动开发做app的时候,是怎么拉起第三方App的呢,下边我们讲一下步骤. 我们以安卓应用打开支付宝为例进行说明: ...

  6. VS 撰写生成了多个撰写错误,其根本原因有X点,如下所列。有关详细信息,请查看CompositionException.Error属性

    打开VS开发程序,莫名其妙的出现如下图错误: 网上找了很多资料,有前辈说以下方法: 解决方案如下 打开文件夹 Users\<CurrentUser>\AppData\Local\Micro ...

  7. 微信小程序-获取用户头像信息以及修改用户头像

    这里主要用到button的open-type功能,官网已有说明: 给button设置open-type="chooseAvatar",来使bindchooseavatar方法生效, ...

  8. T-SQL——将字符串转为单列

    目录 0. 背景 1. 使用STRING_SPLIT函数 2. 自定义分裂函数 3. 使用示例 shanzm-2023年2月22日 0. 背景 代码中执行存储过程,参数是多个且不确定数量,期望SQL查 ...

  9. 精华推荐 |【算法数据结构专题】「延时队列算法」史上非常详细分析和介绍如何通过时间轮(TimingWheel)实现延时队列的原理指南

    时间轮的介绍 时间轮(TimeWheel)是一种实现延迟功能(定时器)的精妙的高级算法,其算法应用范围非常广泛,在Java开发过程中常用的Dubbo.Netty.Akka.Quartz.ZooKeep ...

  10. node.js 历史版本下载

    https://nodejs.org/zh-cn/download/releases/