Qt实现抽奖程序

news2024/11/18 18:48:59

一、简介

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

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

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/54928.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

了解并应用数字隔离器的安全限值

介绍 电流隔离在工业和汽车系统中很常见&#xff0c;作为防止高电压或抵消接地电位差的一种手段。设计人员传统上使用光耦合器进行隔离&#xff0c;但在过去几年中&#xff0c;使用电容和磁隔离的数字隔离器变得越来越流行。对于任何此类隔离器&#xff0c;了解其安全限值的重…

关于如何找环形链表的入环点

目录一、判断一个链表是否有环二、找到链表入环的第一个节点一、判断一个链表是否有环 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的…

菇多糖-聚乙二醇-大环配体NOTA,大环配体NOTA-PEG-香菇多糖

菇多糖-聚乙二醇-大环配体NOTA&#xff0c;大环配体NOTA-PEG-香菇多糖 中文名称&#xff1a;香菇多糖-大环配体NOTA 英文名称&#xff1a;Lentinan-NOTA 别称&#xff1a;NOTA修饰香菇多糖&#xff0c;NOTA-香菇多糖 PEG接枝修饰香菇多糖 Lentinan-PEG-NOTA 香菇多糖-聚乙…

设置Excel表格“只读模式”的两种方法

Excel表格的“只读模式”可以帮助我们防止意外更改表格&#xff0c;根据不同需求&#xff0c;表格可以设置“有密码”和“无密码”的两种“只读模式”&#xff0c;下面来说说具体设置方法。 一、无密码“只读模式” 如果主要是想防止自己意外修改了表格&#xff0c;可以设置没…

Jenkins拉分支代码 + tortoiseGit删除分支

日常部署测试代码都使用Jenkins代码手工上传代码&#xff0c;主要减减减减工作量&#xff0c;提高工作效率&#xff1b; 一、安装Git、git-parameter插件及配置方法&#xff0c;安装方法忽略一万字&#xff0c;解决不了绕道度娘问问 二、创建项目&#xff0c;设置参数 This pr…

[操作系统笔记]基本分页存储管理

内容系听课复习所做笔记&#xff0c;图例多来自课程截图 基本分页存储管理 两次访存&#xff0c;第一次查页表&#xff0c;第二次访问目标内存单元 将内存空间分为一个个大小相等的分区&#xff08;比如每个分区4KB&#xff09;&#xff0c;每个分区就是一个“页框”&#xff0…

[附源码]计算机毕业设计springboot物业管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

澜沧古茶在港交所上市申请失效:收入不及八马茶业,股东提前套现

12月1日&#xff0c;贝多财经从港交所披露易了解到&#xff0c;普洱澜沧古茶股份有限公司&#xff08;下称“澜沧古茶”&#xff09;的上市申请材料失效&#xff0c;目前已无法正常查看或下载。据贝多财经了解&#xff0c;“失效”并不意味着上市失败。 事实上&#xff0c;招股…

selnium操作输入框无法输入内容

问题描述 分析问题 1、开始以为等待时间问题没有找到元素&#xff08;没解决&#xff09; 2、使用js操作元素&#xff08;没解决&#xff09; 3、定位到光标元素 4、种cookie直接走接口调用 问题描述 selenium.common.exceptions.ElementNotInteractableException: Mess…

企业数据图表- FineReport函数计算组成和语法概述

1. 概述 1.1 版本 1.2 功能简介 在设计模板时用户需要频繁的使用公式函数&#xff0c;例如&#xff1a;求和、求个数、做判断等等。 本文介绍函数的计算组成和语法。 2. 计算语法 2.1 概览 组成部分 语法 示例 函数 SUM(合同金额)、SUM(A1) 数据列 可输入有数据列的…

基于Vue+nodejs+Element-ui的聊天框项目

目录一、项目简介二、环境介绍三、系统展示四、视频功能展示五、前端核心代码展示六、MySQL 数据库创建功能展示七、node.js 核心代码八、总结一、项目简介 本项目基于纯前端&#xff08;移动端&#xff09;技术开发一个聊天系统&#xff0c;界面美观大方&#xff0c;采用Node…

PowerShell禁止运行脚本

运行脚本报错(pnpm -v) pnpm : 无法加载文件 D:\win11\program\NVM\nodejs\pnpm.ps1&#xff0c;因为在此系统上禁止运行脚本。有关详细信息&#xff0c;请参阅 https:/go.mi crosoft.com/fwlink/?LinkID135170 中的 about_Execution_Policies。 所在位置 行:1 字符: 1pnpm -v…

洛谷千题详解 | P1019 [NOIP2000 提高组] 单词接龙【C++、Java语言】

博主主页&#xff1a;Yu仙笙 专栏地址&#xff1a;洛谷千题详解 目录 题目描述 输入格式 输出格式 输入输出样例 解析&#xff1a; C源码&#xff1a; Java源码&#xff1a; -----------------------------------------------------------------------------------------------…

java+mysql基于SSM共享型汽车租赁系统-计算机毕业设计

项目介绍 共享汽车租赁公司的共享汽车租赁流程复杂、数据庞大&#xff0c;往往一个疏忽就会给公司造成极大的损失&#xff0c;于是越来越多的共享汽车租赁公司需要一个对各项信息的管理平台来避免这样的损失。为了满足这个需求&#xff0c;我们开发一个针对共享汽车租赁信息的…

MR直播实例(混合现实直播)高品质企业直播

阿酷TONY / 2022-12-2 / 长沙 / 超多组图 绿幕抠像 虚拟场景&#xff08;三维场景&#xff09;实时渲染&#xff0c;降低直播成本&#xff0c;带来线下活动所没有的沉浸式视听体验。 虚拟舞台场景介绍参见&#xff1a; 企业年会直播来个虚拟舞台场景如何&#xff1f;_阿…

负载均衡与高可用

目录 负载均衡 理论部分 应用层负载均衡 环境搭建 代理服务器配置 web服务器配置 验证 网络层负载均衡 环境搭建 代理服务器配置 mysql服务器配置 验证 高可用 理论部分 环境搭建 负载均衡高可用 lb1主要服务器配置 lb2备份服务器配置 web配置 验证 nginx故障问题 →→→→ 大虾…

【MySQL】-增删查改

作者&#xff1a;学Java的冬瓜 博客主页&#xff1a;☀学Java的冬瓜&#x1f319; 专栏&#xff1a;MySQL 分享&#xff1a;至若春和景明&#xff0c;波澜不惊&#xff0c;上下天光&#xff0c;一碧万顷。沙鸥翔集&#xff0c;锦鳞游泳&#xff0c;岸芷汀兰&#xff0c;郁郁青青…

傻妞旧版合集新版订阅

目录一、前言二、下载三、新版傻妞订阅合集一、前言 傻妞旧版本(合集),包含amd和arm版本收集于TG 我的是amd架构 [rootecs-mike_note ~]# cat /proc/version Linux version 4.11.8-1.el7.elrepo.x86_64 (mockbuildBuild64F25) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-11…

Vue中的计算属性

计算属性&#xff1a;实际上是把vm中的属性进行计算加工&#xff0c;最后能够返回给页面一个结果 细想一下&#xff0c;其实methods方法也能实现1中描述的现象&#xff0c;但是计算属性最大的优势是缓存&#xff01;&#xff01;&#xff01; 举个例子 <div id"root&q…

【Android App】物联网实战项目之自动驾驶的智能小车(附源码和演示 超详细)

需要源码请点赞关注收藏后评论区留言私信~~~~ 当今社会正在步入一个万物互联的时代&#xff0c;它的技术基石主要来自5G、物联网和人工智能。 三者融合产生了许多新产品&#xff0c;其中最璀璨的当数自动驾驶的电动车&#xff1b;它汇聚了最新科技与工程实践的成果&#xff0c;…