当前位置: 首页 > news >正文

【Qt】三种方式实现抽奖小游戏

简介

本文章是基本Qt与C++实现一个抽奖小游戏,用到的知识点在此前发布的几篇文章。
下面是跳转链接:
【Qt控件之QLabel】用法及技巧链接: https://blog.csdn.net/MrHHHHHH/article/details/133691441?spm=1001.2014.3001.5501

【Qt控件之QPushButton】用法及技巧 链接:
https://blog.csdn.net/MrHHHHHH/article/details/133692079?spm=1001.2014.3001.5501

【Qt控件之QDialog】用法及技巧 链接:
https://blog.csdn.net/MrHHHHHH/article/details/133721638?spm=1001.2014.3001.5501

【Qt控件之QMainWindow】用法及技巧 链接:
https://blog.csdn.net/MrHHHHHH/article/details/133722035?spm=1001.2014.3001.5501

【Qt控件之QTimer】用法及技巧 链接:
https://blog.csdn.net/MrHHHHHH/article/details/133722476?spm=1001.2014.3001.5501

实现方式

实现方式多种多样,但毕竟是小程序,需求明确(就没考虑操作及优化),功能简单,条理清晰,主要提供三种实现方式(此阶段未实现概率设置,之后再发布概率设置版本吧):

1. 基于while循环
  • 示例:
    先粘贴UI
    在这里插入图片描述

.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>QT_FORWARD_DECLARE_CLASS(C_DlgSetting)namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:// 退出void slot_actQuit_triggered();// 设置概率void slot_actSetting_triggered();// 开始void slot_btnStart_clicked();// 停止void slot_btnStop__clicked();private:Ui::MainWindow *ui;C_DlgSetting*       m_pDlgSetting; // 概率设置类bool                m_bFlag = false;// 标志
};#endif // MAINWINDOW_H

.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "DlgSetting.h"#include <QTime>
#include <QThread>
#include <QCoreApplication>MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);// m_pDlgSetting = new C_DlgSetting(this);// 信号和槽{connect(ui->action_quit, &QAction::triggered, this, &MainWindow::slot_actQuit_triggered);connect(ui->action_setting, &QAction::triggered, this, &MainWindow::slot_actSetting_triggered);connect(ui->btn_start, &QPushButton::clicked, this, &MainWindow::slot_btnStart_clicked);connect(ui->btn_stop, &QPushButton::clicked, this, &MainWindow::slot_btnStop__clicked);}// 声明随机数种子,不然就是伪随机(每次产生的随机数都一样)qsrand(QTime(0, 0, 0).secsTo(QTime::currentTime()));
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::slot_actQuit_triggered()
{close();
}void MainWindow::slot_actSetting_triggered()
{// m_pDlgSetting->exec();
}void MainWindow::slot_btnStart_clicked()
{if(m_bFlag){return;}QStringList sl;sl << "一等奖" << "二等奖" << "三等奖" << "四等奖" << "五等奖";m_bFlag = true;while (m_bFlag) {int nRange = qrand() % 5;ui->label_turn->setText(sl.at(nRange));// 100ms转一次QThread::msleep(100);// 防止界面卡死QCoreApplication::processEvents();}
}void MainWindow::slot_btnStop__clicked()
{m_bFlag = false;// 显示最终获奖结果QString strRes = QString("最终结果: %1").arg(ui->label_turn->text());ui->label_res->setText(strRes);
}

.main

#include "mainwindow.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}
  • 结果
    在这里插入图片描述
  • 实现思路
    – 设置UI,注意命名
    – 进行信号和槽连接
    – 实现"开始"和"结束"功能
    – 显示结果
2. 基于定时器
  • 示例
    UI显示与1.是一样的,需借助QTimer实现

QTimer 是 Qt 框架中的一个类,用于在特定的时间间隔后发出一个信号。它是 Qt
的事件循环系统的一部分,该系统允许程序在等待某些事件(如用户输入或定时器超时)时保持响应。

QTimer 的工作原理是将定时器的超时作为一个事件添加到 Qt
的事件队列中。当事件循环检测到定时器超时时,它就会发出预定的信号。这种机制允许 QTimer
在等待定时器超时时不会阻塞用户界面,因为事件循环可以继续处理其他事件,如用户输入或绘制事件。

相比之下,如果使用标准的 C++ 定时器,如
std::this_thread::sleep_for,在等待定时器超时时,当前线程将被阻塞,无法处理其他事件。这会导致用户界面无响应,给用户一种程序已经卡死的感觉。

直接粘贴相关代码:
.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QTimer>namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:// 退出void slot_actQuit_triggered();// 开始void slot_btnStart_clicked();// 停止void slot_btnStop__clicked();// 定时器处理void slot_timeout();private:Ui::MainWindow *ui;bool                m_bFlag = false;// 标志QTimer*             m_pTimer;// 定时器
};#endif // MAINWINDOW_H

.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"#include <QTime>
#include <QThread>
#include <QCoreApplication>MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);m_pTimer = new QTimer(this);// 处理connect(m_pTimer, &QTimer::timeout, this, &MainWindow::slot_timeout);// 信号和槽{connect(ui->action_quit, &QAction::triggered, this, &MainWindow::slot_actQuit_triggered);connect(ui->btn_start, &QPushButton::clicked, this, &MainWindow::slot_btnStart_clicked);connect(ui->btn_stop, &QPushButton::clicked, this, &MainWindow::slot_btnStop__clicked);}// 声明随机数种子,不然就是伪随机(每次产生的随机数都一样)qsrand(QTime(0, 0, 0).secsTo(QTime::currentTime()));
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::slot_actQuit_triggered()
{close();
}
void MainWindow::slot_btnStart_clicked()
{// 此处可先判断定时器是否处于活动状态,如果是,则返回;否则,再启动// ToDoSomething{}m_pTimer->start(100);
}void MainWindow::slot_btnStop__clicked()
{m_pTimer->stop();// 显示最终获奖结果QString strRes = QString("最终结果: %1").arg(ui->label_turn->text());ui->label_res->setText(strRes);
}void MainWindow::slot_timeout()
{QStringList sl;sl << "一等奖" << "二等奖" << "三等奖" << "四等奖" << "五等奖";int nRange = qrand() % 5;ui->label_turn->setText(sl.at(nRange));
}
  • 实现思路
    – 点击"开始",启动定时器
    – “定时器"实现界面刷新
    – 点击"结束”,停止定时器,并将结果显示
3. 基于线程
  • 实现思路(等之后发布线程文章后,实现)
    – 在主窗口创建一个线程对象
    – 点击"开始",将信号发送到线程中,用于更新几等奖
    – 线程将更新后的信息发送到主窗口
    – 主窗口动态显示
    – 点击"结束",停止线程,显示结果

go.

相关文章:

【Qt】三种方式实现抽奖小游戏

简介 本文章是基本Qt与C实现一个抽奖小游戏&#xff0c;用到的知识点在此前发布的几篇文章。 下面是跳转链接&#xff1a; 【Qt控件之QLabel】用法及技巧链接&#xff1a; https://blog.csdn.net/MrHHHHHH/article/details/133691441?spm1001.2014.3001.5501 【Qt控件之QPus…...

【算法与数据结构】--算法基础--算法设计与分析

一、贪心算法 贪心算法是一种解决优化问题的算法设计方法&#xff0c;其核心思想是在每一步选择当前状态下的最优解&#xff0c;从而希望最终达到全局最优解。下面将介绍贪心算法的原理、实现步骤&#xff0c;并提供C#和Java的实现示例。 1.1 原理&#xff1a; 贪心算法的原…...

vue部分入门知识点代码示例

1. Vue实例 Vue.js的核心是Vue实例&#xff0c;用来管理你的应用。以下是一个创建Vue实例的示例&#xff1a; <!DOCTYPE html> <html> <head><title>Vue.js入门示例</title><!-- 引入Vue.js库 --><script src"https://cdn.jsdel…...

【图灵】Spring为什么要用三级缓存解决循环依赖问题

这里写自定义目录标题 一、什么是循环依赖二、什么是单例池&#xff1f;什么是一级缓存&#xff1f;三、什么是二级缓存&#xff0c;它的作用是什么&#xff1f;四、什么是三级缓存&#xff0c;它的作用是什么&#xff1f;五、为什么Spring一定要使用三级缓存来解决循环依赖六、…...

bert入门

bert是什么 BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;是一种自然语言处理&#xff08;NLP&#xff09;中的预训练模型&#xff0c;它是基于Transformer架构的一种深度学习模型。BERT的主要目标是在大规模文本语料库上进行预训练&a…...

蓝桥杯基础---切面条

切面条 一根高筋拉面&#xff0c;中间切一刀&#xff0c;可以得到2根面条。 如果先对折1次&#xff0c;中间切一刀&#xff0c;可以得到3根面条。 如果连续对折2次&#xff0c;中间切一刀&#xff0c;可以得到5根面条。 那么&#xff0c;连续对折10次&#xff0c;中间切一刀…...

Spring Data Redis使用方式

1.导入Spring Data Redis的maven坐标 pom.xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> 2. 配置Redis数据源 2.1application.yml文件…...

HarmonyOS/OpenHarmony原生应用开发-华为Serverless认证服务说明(二)

一、支持HarmonyOS(Stage模型-API9)应用的账户注册登录方式 文档中的TS作者认为就是ArkTS之意。暂时支持四种模式&#xff0c;手机、邮箱、匿名、自有账户。 二、暂时不支持HarmonyOS(Stage模型-API9)应用的账户注册登录方式 包括华为账户注册登录&#xff0c;HarmonyOS…...

华为数通方向HCIP-DataCom H12-831题库(多选题:241-259)

第241题 设备产生的信息可以向多个方向输出信息,为了便于各个方向信息的输出控制,信息中心定义了10条信息通道,使通道之间独立输出,缺省情况下,以下哪些通道对应的输出方向可以接收Trap信息? A、console通道 B、logbuffer通道 C、snmpagent通道 D、trapbuffer通道 答案:…...

深度学习在 NumPy、TensorFlow 和 PyTorch 中实现所有损失函数

目录 一、说明 二、内容提示 三、均方误差 (MSE) 损失 3.1 NumPy 中的实现 3.2 在 TensorFlow 中的实现 3.3 在 PyTorch 中的实现 四、二元交叉熵损失 4.1 NumPy 中的实现 4.2 在 TensorFlow 中的实现 4.3 在 PyTorch 中的实现 五、加权二元交叉熵损失 5.1 分类交叉熵损失 5.2 …...

超低延时直播技术演进之路-进化篇

一、概述 网络基础设施升级、音视频传输技术迭代、WebRTC 开源等因素&#xff0c;驱动音视频服务时延逐渐降低&#xff0c;使超低延时直播技术成为炙手可热的研究方向。实时音视频业务在消费互联网领域蓬勃发展&#xff0c;并逐渐向产业互联网领域加速渗透。经历了行业第一轮的…...

相机坐标系之间的转换

一、坐标系之间的转换 一个有4个坐标系&#xff1a;图像坐标系、像素坐标系、相机坐标系、世界坐标系。 1.图像坐标系和像素坐标系之间的转换 图像坐标系和像素坐标系在同一个平面&#xff0c;利用平面坐标系之间的转换关系可以之知道两个坐标系变换的公式&#xff0c;并且该…...

jvm--对象实例化及直接内存

文章目录 1. 创建对象2. 对象内存布局3. 对象的访问定位4. 直接内存&#xff08;Direct Memory&#xff09; 1. 创建对象 创建对象的方式&#xff1a; new最常见的方式、Xxx 的静态方法&#xff08;单例模式&#xff09;&#xff0c;XxxBuilder/XxxFactory 的静态方法Class 的…...

【数据结构与算法】如何对快速排序进行细节优化以及实现非递归版本的快速排序?

君兮_的个人主页 即使走的再远&#xff0c;也勿忘启程时的初心 C/C 游戏开发 Hello,米娜桑们&#xff0c;这里是君兮_&#xff0c;国庆长假结束了&#xff0c;无论是工作还是学习都该回到正轨上来了&#xff0c;从今天开始恢复正常的更新频率&#xff0c;今天为大家带来的内容…...

【电商API接口的应用:电商数据分析入门】初识Web API(一)

如何使用Web应用变成接口(API)自动请求网站到特定信息而不是整个网站&#xff0c;再对这些信息进行可视化。由于这样编写到程序始终使用最新到数据来生成可视化&#xff0c;因此即便数据瞬息万变&#xff0c;它呈现到信息也都是最新的。 使用Web API Web API是网站的一部分&am…...

大运新能源天津车展深度诠释品牌魅力 为都市人群打造理想车型

如今&#xff0c;新能源汽车行业发展潜力巨大&#xff0c;不断吸引无数车企入驻新能源汽车赛道&#xff0c;而赛道的持续紧缩也让一部分车企很难找到突破重围的机会。秉持几十年的造车经验&#xff0c;大运新能源凭借雄厚的品牌实力从一众车企中脱颖而出。从摩托车到重卡&#…...

深入浅出:react高阶成分(HOC)的应用

React中的HOC&#xff08;Higher-Order Component&#xff09;是一种高阶组件的模式&#xff0c;它是一个函数&#xff0c;接收一个组件作为参数&#xff0c;并返回一个新的包装组件。HOC可以用于增强组件的功能&#xff0c;例如添加属性、处理生命周期方法、共享状态等。 HOC…...

分库分表(3)——ShardingJDBC实践

一、ShardingSphere产品介绍 Apache ShardingSphere 是一套开源的分布式数据库中间件解决方案组成的生态圈&#xff0c;它由 JDBC、Proxy 和 Sidecar&#xff08;规划中&#xff09;这 3 款相互独立&#xff0c;却又能够混合部署配合使用的产品组成。 它们均提供标准化的数据分…...

Xcode 15下,包含个推的项目运行时崩溃的处理办法

升级到Xcode15后&#xff0c;部分包含个推的项目在iOS17以下的系统版本运行时&#xff0c;会出现崩溃&#xff0c;由于崩溃在个推Framework内部&#xff0c;无法定位到具体代码&#xff0c;经过和个推官方沟通&#xff0c;确认问题是项目支持的最低版本问题。 需要将项目的最低…...

《安富莱嵌入式周报》第324期:单对以太网技术实战,IROS2023迪士尼逼真机器人展示,数百万模具CAD文件下载,闭环步进电机驱动器,CANopen全解析

周报汇总地址&#xff1a;嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 更新一期视频教程&#xff1a; 第8期ThreadX视频教程&#xff1a;应用实战&#xff0c;将裸机工程移植到RTOS的任务划分…...

3分钟上手QrazyBox:让损坏的二维码“起死回生“的终极修复工具

3分钟上手QrazyBox&#xff1a;让损坏的二维码"起死回生"的终极修复工具 【免费下载链接】qrazybox QR Code Analysis and Recovery Toolkit 项目地址: https://gitcode.com/gh_mirrors/qr/qrazybox 你是否曾经遇到过这样的场景&#xff1a;打印出来的二维码被…...

别再死记硬背了!我用700多页图解八股文,帮你把Java面试考点画成故事

用视觉叙事重构Java面试&#xff1a;700页图解背后的认知科学实践 翻开任何一本Java面试指南&#xff0c;你大概率会看到密密麻麻的文字罗列——"JVM内存结构分为哪几部分&#xff1f;""Synchronized和ReentrantLock有什么区别&#xff1f;"这些被称为&quo…...

claw-diary:基于Git与Markdown的开发者命令行日记工具

1. 项目概述&#xff1a;一个面向开发者的命令行日记工具最近在折腾个人知识管理&#xff0c;发现市面上的日记软件要么太重&#xff0c;要么太花哨&#xff0c;要么就是数据被锁在云端&#xff0c;让人不太放心。作为一个常年与终端为伴的开发者&#xff0c;我一直在想&#x…...

全球BGA锡球市场高速成长:2025年2.55亿美元筑基,2032年剑指4.43亿,8.3%CAGR锚定长期高增长逻辑

BGA锡球&#xff08;BGA Solder Ball&#xff09; 是用于替代IC元件封装结构中引脚的核心连接件&#xff0c;满足电性互连及机械连接的双重要求。简而言之&#xff0c;它是BGA封装工艺中不可或缺的焊接材料。QYResearch调研显示&#xff0c;2025年全球BGA锡球市场规模大约为2.5…...

ZipCPU/dspfilters:轻量级C++ IIR滤波器库的设计原理与嵌入式应用

1. 项目概述&#xff1a;从零开始理解一个数字信号处理滤波器库最近在整理一些嵌入式音频处理的项目&#xff0c;又翻出了ZipCPU/dspfilters这个仓库。这其实是一个在GitHub上存在了相当一段时间的C数字信号处理&#xff08;DSP&#xff09;滤波器库&#xff0c;由ZipCPU&#…...

告别浏览器卡顿:如何用Play-with-MPV解锁网页视频专业播放体验

告别浏览器卡顿&#xff1a;如何用Play-with-MPV解锁网页视频专业播放体验 【免费下载链接】play-with-mpv Chrome extension that allows you to play videos in webpages like youtube with MPV instead 项目地址: https://gitcode.com/gh_mirrors/pla/play-with-mpv …...

AISuperDomain:构建AI API智能网关,解决网络延迟与高可用难题

1. 项目概述与核心价值最近在折腾一些自动化脚本和本地化AI应用时&#xff0c;我遇到了一个挺普遍但又有点烦人的问题&#xff1a;如何让我的程序能稳定、高效地访问那些部署在境外的AI服务API&#xff0c;比如OpenAI、Claude或者一些开源的模型托管平台。直接调用&#xff1f;…...

第十五篇:《压测结果分析与调优实践:瓶颈定位与性能优化》

压测执行只是开始&#xff0c;真正的价值在于从结果中定位瓶颈并推动优化。面对一堆响应时间、TPS、错误率曲线&#xff0c;如何判断系统哪里出了问题&#xff1f;如何区分是代码、数据库、中间件还是硬件瓶颈&#xff1f;本文将系统讲解压测结果的分析方法&#xff0c;结合监控…...

声临其境 安全直达 ——NR2048 赋能矿场高可靠高清语音通信

在矿山开采作业中&#xff0c;通信是安全生产的生命线。井下巷道狭长封闭、机械轰鸣、粉尘潮湿、瓦斯与易燃易爆环境并存&#xff0c;传统通信设备普遍存在噪声大、回声重、易啸叫、传输模糊、可靠性不足等痛点&#xff0c;直接威胁调度指令下达、应急呼叫响应与人员生命安全。…...

使用AirLift ESP32与CircuitPython快速实现蓝牙低功耗通信

1. 项目概述与核心价值 如果你正在寻找一种为你的微控制器项目添加蓝牙低功耗&#xff08;BLE&#xff09;连接能力的方案&#xff0c;但又不想被复杂的射频电路设计和底层协议栈开发所困扰&#xff0c;那么使用Adafruit AirLift ESP32作为协处理器&#xff0c;配合CircuitPyth…...