Qt实现抽奖程序
创始人
2024-03-13 03:57:14
0

一、简介

该程序命名为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. 文件操作

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

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

相关内容

热门资讯

AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWR报告解读 WORKLOAD REPOSITORY PDB report (PDB snapshots) AW...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
群晖外网访问终极解决方法:IP... 写在前面的话 受够了群晖的quickconnet的小水管了,急需一个新的解决方法&#x...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
Azure构建流程(Power... 这可能是由于配置错误导致的问题。请检查构建流程任务中的“发布构建制品”步骤,确保正确配置了“Arti...