Qt实现抽奖程序

发布时间:2025-12-09 11:53:43 浏览次数:2

一、简介

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

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

详细代码地址:https://download.csdn.net/download/sinat_41752325/15416138

参考:https://blog.csdn.net/m0_37907070/article/details/72843132

不足之处请指出,不胜感激!!!

qt抽奖
需要做网站?需要网络推广?欢迎咨询客户经理 13272073477