Qt实现抽奖程序

Qt实现抽奖程序一、简介该程序命名为Lucky,实现的功能如下:1.加载抽奖人员名单,并保存加载路径;2.单击左键或者点击ctrl+s开始抽奖,并滚动显示人员名单,显示的人员名单格式为部门-姓名。3.

大家好,又见面了,我是你们的朋友全栈君。

 一、简介

该程序命名为Lucky,实现的功能如下:

1. 加载抽奖人员名单,并保存加载路径;
2. 单击左键或者点击ctrl+s开始抽奖,并滚动显示人员名单,显示的人员名单格式为 部门-姓名。
3. 单击左键或者点击ctrl+s停止抽奖,并固定显示中奖人员名单。

工具:Qt5.13 + msvc2015

二、界面显示

<span role="heading" aria-level="2">Qt实现抽奖程序

①:滚动显示名单
②:抽奖开始/停止显示
③:名单路径及加载按钮

三、详解

抽奖程序,简单来说,需要有人员名单+抽奖功能,至于奖品,本程序未实现显示奖品的功能,只是一个简易的抽奖小程序。

3.1 加载名单并保存路径功能实现

使用QFileDialog::getOpenFileName()函数加载人员名单文件。

或者直接粘贴路径,利用QLineEdit的editingFinished信号获取到路径。

SaveSettings()函数把加载的文件路径保存下来,保存路径在luckySet.ini文件。使用QSettings类保存。
<span role="heading" aria-level="2">Qt实现抽奖程序

代码如下:

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

 

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/155730.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • BP神经网络算法改进文献_bp神经网络算法流程图

    BP神经网络算法改进文献_bp神经网络算法流程图周志华机器学习BP改进试设计一个算法,能通过动态调整学习率显著提升收敛速度,编程实现该算法,并选择两个UCI数据集与标准的BP算法进行实验比较。1.方法设计传统的BP算法改进主要有两类:-启发式算法:如附加动量法,自适应算法-数值优化法:如共轭梯度法、牛顿迭代法、Levenberg-Marquardt算法(1)附加动量项这是一种广泛用于加速梯度下降法收敛…

    2025年10月26日
    4
  • 软件测试笔试面试题目完全汇总

    软件测试笔试面试题目完全汇总1、软件测试的流程2、web测试和APP测试的区别仅仅从功能测试的层面上来讲的话,在流程和功能测试上是没有区别的。那么区别在哪里呢?由于载体不一样,所以系统测试和一些细节可能会不一样。那么我们就要先来了解,web和app的区别。web项目,一般都是b/s架构,基于浏览器的,而app则是c/s的,必须要有客户端。那么在系统测试测试的时候就会产生区别了。首先从系统架构来看的话,web测试…

    2022年5月8日
    42
  • mysql截取前几个字符串_MySQL 截取字符串函数的sql语句

    mysql截取前几个字符串_MySQL 截取字符串函数的sql语句1、left(name,4)截取左边的4个字符列:SELECTLEFT(201809,4)年结果:20182、right(name,2)截取右边的2个字符SELECTRIGHT(201809,2)月份结果:093、SUBSTRING(name,5,3)截取name这个字段从第五个字符开始只截取之后的3个字符SELECTSUBSTRING(‘成都融资事业部’,5,3)结果:事业部4、…

    2022年6月1日
    42
  • xshell安装步骤_Xshell怎么使用

    xshell安装步骤_Xshell怎么使用XShell可以在Windows界面下来访问远端不同系统下的服务器,从而比较好的达到远程控制终端的目的。它支持RLOGIN、SFTP、SERIAL、TELNET、SSH2和SSH1,可以非常方便的对Linux主机进行远程管理。除此之外,其还有丰富的外观配色方案以及样式选择。Xshell免费版官网下载地址https//www.xshell.com/zh/free-for-home-school/链接https//pan.baidu.com/s/1NJGWZHkByakOkQpKfkc7Yg。…

    2025年9月5日
    43
  • ndarray 数据类型 —— dtype

    ndarray 数据类型 —— dtypefghfhg

    2022年6月10日
    31
  • ps后期调色教程,ps怎么后期调色步骤图「建议收藏」

    ps后期调色教程,ps怎么后期调色步骤图「建议收藏」欢迎来到易夏岚UI设计之Photoshop系列教学课程,今天我们来学习ps后期调色教程,ps怎么后期调色步骤图。在平时修图的过程中,我们常常会遇到修完图以后觉得色彩还是有些不搭配,使得整个图片看起来效果都不是特别好,那么如何使用ps来进行后期的调色呢?今天我们就一起来看一下吧!先附上原图和做完后期的成片,左为原图,右为调色后。这类小清新的照片的后期思路有一个大的方向,用术语来说就是往高调片走,通俗来说就是明度较高(较亮)的片子。在直方图上的一般表现是这样的:大量的照片信息集中在直方图的…

    2022年6月18日
    18

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号