我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

前言:

本文简述:代码中有点小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 随机转盘小项目内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

JS实现扫雷项目的示例分析

小编给大家分享一下JS实现扫雷项目的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!项目展示图项目准备一样的,我们先是准备出三个文件夹,以及根目录下的index.html 文件然后是两张图片(地雷 和 旗子)之后是h
2023-06-15

Python实现随机生成算术题的示例代码

这篇文章主要为大家详细介绍了如何利用Python实现随机生成算术题的功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
2023-05-14

基于Python实现随机点名系统的示例代码

在某些难以抉择得时候,我们经常要用外力来帮助我们做出选择,比如,梁山出征方腊前沙场点兵,挑选先锋的场景。所以本文就来用Python做个随机点名系统吧,需要的可以参考一下
2023-05-14

Android编程实现随机生成颜色的方法示例

本文实例讲述了Android编程实现随机生成颜色的方法。分享给大家供大家参考,具体如下:网上有个ColorPicker开源项目,选择颜色值。而在这里我想实现的是动态修改一个view的背景色。开一个线程,每隔1s修改一次view的背景色。我们
2023-05-30

python实现H2O中的随机森林算法介绍及其项目实战

随机森林(Random Forest)是一种集成学习方法,通过组合多个决策树来进行分类和回归。它在H2O中也有相应的实现。H2O是一个用于大规模机器学习的开源平台,它提供了分布式的机器学习算法,包括随机森林。H2O的随机森林算法使用了bag
2023-08-15

Python实现数字小写转大写的示例详解

这篇文章主要为大家详细介绍了如何利用Python实现数字小写转大写的功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
2022-12-14

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录