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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 美国福克斯Fox热式流量计[通俗易懂]

    福克斯Fox热式流量计英维思集团的美国Foxboro公司是一家为工业过程自动化提供仪表、系统和服务的制造商,在全球同行业中处于**地位。它为用户提供的解决方案包括一切典型的智能型现场仪表,自动化系统以及先进的软件应用,以及与之相配套的综合工程。美国FOXBORO福克斯波罗因其产品的高智能和质量稳定性在电力、石油、化工、天然气、冶金、水泥、造纸、采矿、轻纺、食品、医药等行业中大量使用,获得了用户的广泛好评,产品行销全球,销售业绩在全球自动化领域内稳居前列。公司可提供从简单的需求到**的过程控制仪表,

    2022年4月11日
    157
  • win7任务管理器快捷键是什么

    win7任务管理器快捷键是什么根据小编的观察与发现,发现有些小伙伴不是因为不使用快捷键,而是不知道任务管理器的快捷键。所以为了帮助这些小伙伴,小编今天就来告诉你们打开任务管理器的快捷键是什么。我们的电脑其实在打开一些应用的时候,是有快捷键的。但是往往都是因为我们不知道快捷键是什么,所以才会没有用。所以今天小编就来告诉你们打开任务管理器的快捷键是什么。方法一:任务管理器打开的快捷键:ctrl+alt…

    2022年6月18日
    38
  • UDP Flood攻击「建议收藏」

    UDP Flood攻击「建议收藏」本文转载自华为企业互动社区大家好,强叔又来了!上一期,强叔给大家介绍了SYNFlood的攻击和防御,本期强叔将带领大家一起来学习一下另一种常见的流量型攻击:UDPFlood。讲UDPFlood之前,强叔还是先从UDP协议讲起。在讲SYNFlood的时候,我们知道了TCP协议是一种面向连接的传输协议。但是UDP协议与TCP协议不同,UDP是一个无连接协议。使用UDP协议传输数据之前…

    2022年10月2日
    2
  • Hrbust_HR4995

    Hrbust_HR4995字典树的模板题连接:背单词AC代码:#include#include#includeusingnamespacestd;structTire{intnCount;Tire*next[26];Tire(){memset(next,0,sizeof(next));nCount=0;

    2022年10月2日
    4
  • Java File中renameTo的介绍和使用说明

    看到项目中有个地方用的File的renameTo这个方法,本以为这个方法就是用来文件重命名的,但是项目中确用它来进行文件的移动。就是使用renameTo将一个文件从一个目录移动另一个目录下!下面就简单介绍一下renameTo,并整理一个renameTo的使用!renameTo的介绍官方文档说明/** * 重新命名此抽象路径名表示的文件。 此方法行为的许多方面都是与平台有关的:重命名操作无法

    2022年2月26日
    42
  • srm 534

    srm 534

    2022年1月27日
    45

发表回复

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

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