跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

Qt实现抽奖程序

一、简介 该程序命名为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类使用 文件操作 其中最重要的是定时器及随机数的使用。

进群领取 qt 开发学习资料以及技术交流 在下方 ↓↓↓↓↓↓↓↓

相关文章