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)
上一篇 2022年7月3日 下午12:16
下一篇 2022年7月3日 下午12:16


相关推荐

  • OpenClaw配置后无输出问题排查与解决指南

    OpenClaw配置后无输出问题排查与解决指南

    2026年3月13日
    3
  • 15种手机游戏引擎和开发工具介绍

    15种手机游戏引擎和开发工具介绍工欲善其事,必先利其器。对移动游戏开发者来说,高效实用的开发工具必不可少。近日,英国著名产业杂志《Develop》刊出了一篇文章,作者艾伦·李在文中推荐了15种移动游戏开发工具,从游戏引擎,到音效制作、推广等工具都有涉及。以下为原文主要内容编译。引擎和移动开发工具包Marmalade简介:Marmalade被很多人认为是跨平台制作C++游戏的最佳平台。通过MarmaladeSDK,开发者可以在单一的Marmalade项目文件夹中打开Xcode或VisualStudio,将

    2022年5月22日
    142
  • PHP– AWS S3云存储上传多文件与上传单个文件

    PHP– AWS S3云存储上传多文件与上传单个文件

    2022年2月10日
    51
  • Java中toString方法作用

    Java中toString方法作用C 里面也有个 ToString 注意大小写的不同 Java 的 toString 的和 C 的 ToString 完全不是同一概念 首先 toString 是一个 自我描述 的方法 然后它可以被重写 java nbsp viewplaincop public nbsp class nbsp Person nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp private nbsp String nbsp na

    2026年3月20日
    2
  • SPI协议简单介绍

    SPI协议简单介绍导言SPI是串行扩展总线。串行总线技术可以使系统的硬件设计大大简化、系统的体积减小、可靠性提高。同时系统的更改和扩充极为容易。常用的串行扩展总线有:I2C(InterICBus)总线、单总线(1-WIREBUS)、SPI(SerialPeripheralInterface)总线及Microwire/PLUS等。一、SPI协议SPI总线是微控制器四线的外部总线。SPI没有明文标准,是一种事实总线,对通信操作的实现由芯片厂商和驱动开发者通过datasheet和applicat..

    2022年10月15日
    4
  • 运算放大电路在音频放大电路中的应用研究与实现「建议收藏」

    运算放大电路在音频放大电路中的应用研究与实现「建议收藏」1、导言放大电路是构成各种功能模拟电路的基础电路,也是对模拟信号最基本的处理。音频信号可以分解成若干频率的正玄波之和,其频率分为在20Hz~20KHz。不当的放大电路会造成音频信号的失真,亦会带来干扰和噪声。所有电子信息系统组成的原则都应包含:1、满足功能和性能要求,2、尽量简单,3、电磁兼容,4、调试应用简单。因此本文就来研究在不会增大电路复杂度的前提下,如何实现音频信号放大的同时对信号进…

    2022年5月29日
    37

发表回复

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

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