返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >Qt5.9.5随机转盘小项目的实现示例
  • 212
分享到

Qt5.9.5随机转盘小项目的实现示例

2024-04-02 19:04:59 212人浏览 薄情痞子
摘要

目录前言:问题代码段:解决方法代码段:源码:前言: 本文简述:代码中有点小bug(已经粗暴解决),不提倡所有这类型bug都这样解决 问题代码段: 问题描述:由于超时信号造成槽函数形成

前言:

本文简述:代码中有点小bug(已经粗暴解决),不提倡所有这类型bug都这样解决

问题代码段:

问题描述:由于超时信号造成槽函数形成了死循环,也没啥好的方案去替换。

//问题根源
connect(&rtTimer, SIGNAL(timeout()), this, SLOT(rtTimeoutSlot()));//调用超时信号,计时旋转

//死循环部分
void LuckWard::rtTimeoutSlot(){
    rotationAngle++;//旋转因子
    if ((rotationAngle - randNumber) == 90)//当rotationAngle - randNumber==90°
    {
        rtTimer.setInterval(10);//减速到10毫秒
    }
    else if ((rotationAngle - randNumber) == 180)//当rotationAngle - randNumber==180°
    {
        rtTimer.setInterval(15);//减速到15毫秒
    }
    else if ((rotationAngle - randNumber) == 270)//当rotationAngle - randNumber==270°
    {
        rtTimer.setInterval(20);//减速到20毫秒
    }
    else if ((rotationAngle - randNumber) == 360)//当rotationAngle - randNumber==360°
    {
        rotationAngle--;//停下来
        i++;//(PS:由于此处不知道为啥进入了死循环,只能加一个变量进行判断)
        if (i == 1)//判断是否是第一次
        {
            emit luckOverSignal();//利用信号调用结束弹窗
        }
    }
    update();//更新数据
}

解决方法代码段:

解决方法:在死循环内添加了一个全局函数进行计数,判断是否是第一次。从而调用结束信号,弹出窗口。

头文件处添加一个全局变量:

private:
    Ui::LuckWardClass ui;
    int i = 0;                  //记录变量 

实现文件处添加一个“if”进行判断

    //void LuckWard::rtTimeoutSlot()处代码段
    else if ((rotationAngle - randNumber) == 360)//当rotationAngle - randNumber==360°
    {
        rotationAngle--;//停下来
    //解决方法:
        i++;//(PS:由于此处不知道为啥进入了死循环,只能加一个变量进行判断)
        if (i == 1)//判断是否是第一次
        {
            emit luckOverSignal();//利用信号调用结束弹窗
        }
    }

源码:

头文件:luckward.h

#pragma once

#include <QtWidgets/QWidget>
#include "ui_luckward.h"
#include <QPainter>
#include <QDebug>
#include <QTimer>
#include <QMouseEvent>
#include <QTime>
#include <QMessageBox>
class LuckWard : public QWidget
{
    Q_OBJECT

public:

    LuckWard(QWidget *parent = Q_NULLPTR);
    //重载绘制事件
    void paintEvent(QPaintEvent *ev);
    //重载鼠标按下事件
    void mousePressEvent(QMouseEvent *ev);

    public slots:
    //计时旋转函数
    void rtTimeoutSlot();
    //转盘开始旋转函数
    void luckStartSlot();
    //转盘结束旋转函数
    void luckOverSlot();

signals:
    //转盘开始旋转信号
    void luckStartSignal();
    //转盘结束信号
    void luckOverSignal();

private:
    Ui::LuckWardClass ui;
    int i = 0;                  //记录变量 
    QPainter rotationPainter;   //绘画转盘
    int rotationAngle;          //旋转角度
    int randNumber;             //随机数
    int EndNumber;              //结束数值
    QTimer rtTimer;             //旋转速度
    QPainter pointPainter;      //绘画箭头与钉子
};

UI文件:



#ifndef UI_LUCKWARD_H
#define UI_LUCKWARD_H

#include <QtCore/QVariant>
#include <QtWidgets/QAction>
#include <QtWidgets/QApplication>
#include <QtWidgets/QButtonGroup>
#include <QtWidgets/QHeaderView>
#include <QtWidgets/QWidget>

QT_BEGIN_NAMESPACE

class Ui_LuckWardClass
{
public:

    void setupUi(QWidget *LuckWardClass)
    {
        if (LuckWardClass->objectName().isEmpty())
            LuckWardClass->setObjectName(QStringLiteral("LuckWardClass"));
        LuckWardClass->resize(400, 400);
        LuckWardClass->setMinimumSize(QSize(400, 400));
        LuckWardClass->setMaximumSize(QSize(400, 400));

        retranslateUi(LuckWardClass);

        QMetaObject::connectSlotsByName(LuckWardClass);
    } // setupUi

    void retranslateUi(QWidget *LuckWardClass)
    {
        LuckWardClass->setWindowTitle(QApplication::translate("LuckWardClass", "LuckWard", Q_NULLPTR));
    } // retranslateUi

};

namespace Ui {
    class LuckWardClass: public Ui_LuckWardClass {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_LUCKWARD_H

主函数:main.cpp

#include "luckward.h"
#include <QtWidgets/QApplication>

int main(int arGC, char *argv[])
{
    QApplication a(argc, argv);
    LuckWard w;
    w.show();
    return a.exec();
}

实现文件:luckward.cpp

#include "luckward.h"

LuckWard::LuckWard(QWidget *parent)
    : QWidget(parent)
{
    ui.setupUi(this);
    connect(&rtTimer, SIGNAL(timeout()), this, SLOT(rtTimeoutSlot()));//调用超时信号,计时旋转
    connect(this, SIGNAL(luckStartSignal()), this, SLOT(luckStartSlot()));//用luckStartSignal()发出的信号使转盘开始旋转
    connect(this, SIGNAL(luckOverSignal()), this, SLOT(luckOverSlot()));//用luckOverSignal()发出的信号使转盘结束后弹窗
}
void LuckWard::paintEvent(QPaintEvent *ev)
{
    //绘制转盘
    rotationPainter.begin(this);//开始绘画
    rotationPainter.setRenderHint(QPainter::SmoothPixmapTransfORM);//抗锯齿化
    rotationPainter.translate(200, 200);//修改图片中心点
    rotationPainter.rotate(rotationAngle);//使图片旋转30°
    rotationPainter.drawPixmap(-200, -200, 400, 400, QPixmap("luck.png"));//添加图片
    rotationPainter.end();//结束绘画

    //绘制箭头
    pointPainter.begin(this);//开始绘画
    pointPainter.setRenderHint(QPainter::SmoothPixmapTransform);
    pointPainter.translate(200, 200);//设置绘制坐标位置
    static const QPoint point[4] = { QPoint(0, 18), QPoint(20, 0), QPoint(0, -100), QPoint(-20, 0) };//绘制路径
    pointPainter.setBrush(QColor(Qt::blue));//设置箭头颜色
    pointPainter.drawPolyGon(point, 4);
    //绘制钉子(处于中间点)
    QRect rectanle(-7, -7, 14, 18); //设置绘制坐标位置
    pointPainter.setBrush(QColor(Qt::yellow));//设置钉子颜色
    pointPainter.drawEllipse(rectanle);//绘制椭圆形
    pointPainter.end();//结束绘画
}
void LuckWard::rtTimeoutSlot()
{
    rotationAngle++;//旋转因子

    if ((rotationAngle - randNumber) == 90)//当rotationAngle - randNumber==90°
    {
        rtTimer.setInterval(10);//减速到10毫秒
    }
    else if ((rotationAngle - randNumber) == 180)//当rotationAngle - randNumber==180°
    {
        rtTimer.setInterval(15);//减速到15毫秒
    }
    else if ((rotationAngle - randNumber) == 270)//当rotationAngle - randNumber==270°
    {
        rtTimer.setInterval(20);//减速到20毫秒
    }
    else if ((rotationAngle - randNumber) == 360)//当rotationAngle - randNumber==360°
    {
        rotationAngle--;//停下来
        i++;//(PS:由于此处不知道为啥进入了死循环,只能加一个变量进行判断)
        if (i == 1)//判断是否是第一次
        {
            emit luckOverSignal();//利用信号调用结束弹窗
        }
    }
    update();//更新数据
}

void LuckWard::mousePressEvent(QMouseEvent *ev)
{
    if (ev->button() == Qt::LeftButton)//判断是否鼠标左键按下
    {
        qDebug() << "LeftButton Press" << ev->pos();//打印按下的位置
        //判断是否在此范围内按下鼠标左键(x(180,220),y(216,130))
        if (ev->pos().x() > 180 && ev->pos().x() < 220 && ev->pos().y()<216 && ev->pos().y()>130)
        {
            emit luckStartSignal();
        }
    }
}
void LuckWard::luckStartSlot()
{
    rtTimer.setInterval(50);//设置旋转速度为50毫秒
    rotationAngle = 1;//初始化旋转角为1

    qsrand(QTime(0, 0, 0).secsTo(QTime::currentTime()));//初始化随机数
    randNumber = qrand() % 360 + 180;  //设置随机数取值180 - >360之间
    rtTimer.start(1);//定时器开始
}
void LuckWard::luckOverSlot()
{

    qDebug() << "rotationAngle The Angle" << EndNumber;
    if (EndNumber>0)
    {
        QMessageBox::information(this, QString::fromLocal8Bit("提示"), QString::fromLocal8Bit("恭喜您!中奖了"), QStringLiteral("确定"));
    }
}

ui界面布局样式:

效果图

到此这篇关于Qt 5.9.5 随机转盘小项目的文章就介绍到这了,更多相关Qt 5.9.5 随机转盘小项目内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Qt5.9.5随机转盘小项目的实现示例

本文链接: https://lsjlt.com/news/151942.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Qt5.9.5随机转盘小项目的实现示例
    目录前言:问题代码段:解决方法代码段:源码:前言: 本文简述:代码中有点小bug(已经粗暴解决),不提倡所有这类型bug都这样解决 问题代码段: 问题描述:由于超时信号造成槽函数形成...
    99+
    2024-04-02
  • androidstudio创建C++项目的实现示例
    目录一、创建Native C++工程二、配置工程环境三、运行代码四、下载C++运行依赖的工具包五、创建虚拟机六、运行代码问题一:如果启动虚拟机后,而左上角的虚拟机没有加载出来。问题二...
    99+
    2024-04-02
  • vue项目完成后如何实现项目优化的示例
    目录一、为开发模式与发布模式指定不同的打包入口二、通过externals加载外部CDN资源三、通过CDN优化ElementUI的打包四、首页内容定制五、使用路由懒加载一、为开发模式与...
    99+
    2024-04-02
  • JS实现扫雷项目的示例分析
    小编给大家分享一下JS实现扫雷项目的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!项目展示图项目准备一样的,我们先是准备出三个文件夹,以及根目录下的index.html 文件然后是两张图片(地雷 和 旗子)之后是h...
    99+
    2023-06-15
  • es+flask搜索小项目实现分页+高亮的示例代码
    环境 前端:html,css,js,jQuery,bootstrap后端:flask搜索引擎:elasticsearch数据源:某某之家 项目展示 项目目录 主要源码 获取数据...
    99+
    2024-04-02
  • R语言实现随机森林的方法示例
    目录随机森林算法介绍算法介绍:决策树生长步骤:投票过程:基本思想:随机森林的优点:缺点R语言实现随机森林模型搭建1:randomForest()函数用于构建随机森林模型2:impor...
    99+
    2024-04-02
  • 微信小程序实现幸运大转盘功能的示例代码
    目录一、项目展示二、抽奖页三、领奖页一、项目展示 幸运大转盘是一个简单的抽奖小程序 参与用户点击抽奖便可抽取轮盘的奖品 二、抽奖页 抽奖页是一个大轮盘和活动规则 页面形式简单 主要...
    99+
    2024-04-02
  • spring 项目实现限流方法示例
    目录01、为什么AUSTIN项目需要限流02、如何实现限流?03、代码设计04、总结01、为什么AUSTIN项目需要限流 众所周知,服务器能处理的请求数是有限的,如果请求量特别大,我...
    99+
    2022-11-13
    spring 项目限流 项目限流
  • RocketMQ实现随缘分BUG小功能示例详解
    目录正文实现过程生产者:正文 以前公司的产品已经上线20多年了,主要是维护,也就是改bug。每周我们Team会从Jira上拿我们可以改的bug,因为每个团队负责的业务范围不一样,我们...
    99+
    2022-11-13
    RocketMQ随缘BUG RocketMQ BUG
  • JS实现电影票选座的项目示例
    简单模拟电影票选座,详细代码如下: 利用js实现给li标签添加和取消属性,来实现选座功能。 <!DOCTYPE html> <html lang="en"> ...
    99+
    2024-04-02
  • Vue项目中实现描点跳转scrollIntoView的案例
    目录Vue实现描点跳转scrollIntoView方式一:使用a标签#id形式方式二:scrollIntoView使用vue遇到scrollIntoView无效问题官方文档写的简单V...
    99+
    2024-04-02
  • C++实现控制台随机迷宫的示例代码
    我全程使用TCHAR系列函数,亲测可以不改动代码兼容Unicode/ANSI开发环境,功能正常。大概有100行代码是来自网络的,我也做了改动,侵权请联系删除。 这个代码不能算是完美,...
    99+
    2024-04-02
  • Python实现随机生成算术题的示例代码
    目录前言1、环境准备2、主程序3、效果展示前言 前几天去我姐家里蹭饭吃,发现我姐家里的小外甥女儿已经上小学了,正在疯狂赶作业,加减乘除还有很多题目都经常出错。 我姐说老师每天给他们布...
    99+
    2023-05-14
    Python实现随机生成算术题 Python随机生成算术题 Python生成算术题
  • java中项目实现一个随机输出图片功能
    这期内容当中小编将会给大家带来有关java中项目实现一个随机输出图片功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。java  实现输出随机图片实例代码输出随机图片(CAPTCHA图像):Co...
    99+
    2023-05-31
    java ava 出图
  • Python简单实现图片转字符画的实例项目
    1. 原理 利用 PIL 库来获取图片并修改大小, 利用灰度值转换公式把每一个像素的 RGB 值转为灰度值 gray = int(0.2126*r+0.7152*g+0.0722...
    99+
    2024-04-02
  • vue项目实战的示例分析
    这篇文章主要为大家展示了“vue项目实战的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“vue项目实战的示例分析”这篇文章...
    99+
    2024-04-02
  • Spring Cache 集成 Caffeine实现项目缓存的示例
    目录一、前言二、缓存注解三、实战操作1、依赖引入2、yaml配置3、开启缓存4、模拟方法5、测试6、改造一、前言 Spring Cache本身是Spring框架中一个缓存体系的抽象实...
    99+
    2024-04-02
  • Redis 抽奖大转盘的实战示例
    目录1. 项目介绍2. 项目演示3. 表结构4. 项目搭建4.1 依赖4.2 YML配置4.3 代码生成4.4 Redis 配置4.5 常量管理4.6 业务代码4.7 总结5. 项目...
    99+
    2024-04-02
  • python实现H2O中的随机森林算法介绍及其项目实战
    随机森林(Random Forest)是一种集成学习方法,通过组合多个决策树来进行分类和回归。它在H2O中也有相应的实现。H2O是一...
    99+
    2023-08-15
    python
  • Python实现孤立随机森林算法的示例代码
    目录1 简介2 孤立随机森林算法2.1 算法概述2.2 原理介绍2.3 算法步骤3 参数讲解4 Python代码实现 5 结果 1 简介 孤立森林(isolati...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作