大家好,又见面了,我是你们的朋友全栈君。
一、简介
该程序命名为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
不足之处请指出,不胜感激!!!
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/155730.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...