该程序命名为Lucky,实现的功能如下:
1. 加载抽奖人员名单,并保存加载路径; 2. 单击左键或者点击ctrl+s开始抽奖,并滚动显示人员名单,显示的人员名单格式为 部门-姓名。 3. 单击左键或者点击ctrl+s停止抽奖,并固定显示中奖人员名单。
工具:Qt5.13 + msvc2015
①:滚动显示名单 ②:抽奖开始/停止显示 ③:名单路径及加载按钮
抽奖程序,简单来说,需要有人员名单+抽奖功能,至于奖品,本程序未实现显示奖品的功能,只是一个简易的抽奖小程序。
使用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);
}
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();
}
程序打开加载路径,使用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();
}
总结下来,本程序用到的点有:
其中最重要的是定时器及随机数的使用。
本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓