一、简介

该程序命名为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. 结构型模式 - 享元模式Flyweight

    学习而来,代码是自己敲的.也有些自己的理解在里边,有问题希望大家指出. 更像是单例模式 + 简单工厂模式 享元模式的定义与特点 享元(Fiyweight)模式的定义:运用共享技术来有效的支持大量细粒度 ...

  2. 如何找到CSDN中关注的用户和粉丝?

    如何找到CSDN中关注的用户和粉丝? 刚刚在CSDN个人账号里找了半天都没找到自己关注的人 对CSDN的页面更新感到很迷, 个人账号管理很不人性化, 或者说是根本找不到自己关注的用户以及关注自己的粉丝 ...

  3. windows右键菜单扩展

    今天给大家分享一个我做的小工具,可以自定义扩展右键菜单的功能来提高工作效率,效果图如下: image 如上图,右键菜单多了几个我自定义的菜单 复制文件路径 复制文件夹路径 我的工具箱 <走配置文 ...

  4. 关于计算机与常用DOS命令

    计算机 计算机 计算机由软件和硬件组成. 能够按照程序运行,自动,高速处理海量数据的现代化智能电子设备. 计算机硬件 CPU 主板 内存 电源.主机箱 硬盘 显卡 键盘.鼠标(输入设备) 显示器(输出 ...

  5. 安装和配置Maven项目管理工具

    1.下载Maven工具包:https://maven.apache.org/download.cgi 2.解压apache-maven-3.8.4-bin.zip 3.修改apache-maven-3 ...

  6. python_添加中文编码和脚本

    #!/usr/bin/env python 根据环境设置寻找python路径,必须放在第一行 # coding=utf-8 添加中文编码

  7. SQLSERVER 语句交错引发的死锁研究

    一:背景 1. 讲故事 相信大家在使用 SQLSERVER 的过程中经常会遇到 阻塞 和 死锁,尤其是 死锁,比如下面的输出: (1 row affected) Msg 1205, Level 13, ...

  8. LG P2617 Dynamic Rankings

    \(\text{Problem}\) 动态区间第 \(k\) 小 Dynamic Rankings \(\text{Analysis}\) 整体二分 原本一个询问可二分,但多个询问效率太低 考虑离线, ...

  9. Spring依赖注入问题

    记录一下最近复习的Spirng依赖注入问题 主要介绍两个注入方式 也是用的最多的 1.构造方法注入 2.Setter注入. 参考文档:https://blog.csdn.net/weixin_5541 ...

  10. python 依据IP查找其所属网段

    # coding = 'utf-8' # 依据excel表格中所提供的IP,在另一张表中查找其所属网段 import pandas as pd import IPy df = pd.read_exce ...