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模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

相关内容

热门资讯

前端-session、jwt 目录:   (1)session (2&#x...
linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
<C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...