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


相关推荐

  • 格雷码的实现[通俗易懂]

    格雷码的实现[通俗易懂]问题:产生n位元的所有格雷码。格雷码(GrayCode)是一个数列集合,每个数使用二进位来表示,假设使用n位元来表示每个数字,任两个数之间只有一个位元值不同。例如以下为3位元的格雷码: 000001011010110111101100。如果要产生n位元的格雷码,那么格雷码的个数为2^n.假设原始的值从0开始,格雷码产生的规律是:第一步,改变最右边的

    2022年11月2日
  • 程序员外包平台_人力资源外包和劳务派遣

    程序员外包平台_人力资源外包和劳务派遣程序员接单平台,程序员接单,程序员外包平台,程序员外包

    2022年9月29日
  • html表单提交_html表单标签有哪些

    html表单提交_html表单标签有哪些1.表单属性设置<form>标签表示表单标签,定义整体的表单区域action属性设置表单数据提交地址method属性设置表单提交的方式,一般有“GET”方式和“POST”方式,不区分大小写2.表单元素属性设置name属性设置表单元素的名称,该名称是提交数据时的参数名value属性设置表单元素的值,该值是提交数据时参数名所对应的值3.示例代码<formaction=”https://www.baidu.com”method=”GET”>

    2022年9月26日
  • 树莓派初次使用(史上最全最详细教程!!)「建议收藏」

    树莓派初次使用(史上最全最详细教程!!)「建议收藏」由于自己电脑装虚拟机莫名的卡,所以搞个树莓派来当我的私密环境(嘿嘿,别想歪了!!!)废话不多说,我们开始吧!所需材料:树莓派系统,Win32DiskImager工具(用来把系统写到内存卡上),AngryIPscaner(用来扫描树莓派的IP地址),x-shell(远程登录工具)树莓派板子(我的是3代的板子),电源(我用的是我旧的安卓手机充电器与线)一个16GTF内存卡(以前的手机内

    2022年10月14日
  • 大数据人工智能的未来_未来人工智能发展前景

    大数据人工智能的未来_未来人工智能发展前景在百度大数据开放大会上,搞计算机学术理论的怀进鹏校长的演讲犹如给所有听众的一记闷棍,怀校长的学术演讲把大家弄得云里雾里,把所有人弄晕了,现场能够听懂的绝对是少数,可能都会觉得怀校长有点像个外星人一般在那自顾自的演讲。作为一个曾经有志从事人工智能研究但失之交臂的又是学计算机毕业的人却越听越兴奋,冥冥中似乎找到了未来的人工智能所能抵达的可能性,那么笔者现在就尝试把怀教授的演讲转换为大家也能够听懂的语言…

    2022年10月5日
  • javaweb参考文献_javaweb参考文献

    javaweb参考文献_javaweb参考文献计算机毕业设计外文参考文献[1].Abdellatif,T.andF.Boyer.AnodeallocationsystemfordeployingJavaEEsyst.计算机毕业设计外文参考文献[1]…….Web应用程序安全外文翻译参考文献Web应用程序安全外文翻译参考文献(文档含中英文对照即英文原文和中文翻译)原文:BasicSecur…

    2022年9月30日

发表回复

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

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