Qt之转盘抽奖

Qt之转盘抽奖

叙述

今天参加了,苏宁易购官网上的幸运大转盘抽奖活动。可惜了,没中,但是触发了下我的灵感,什么灵感呢。就是用QT也实现一把大转盘抽奖。好了,上效果图吧,仅供参考学习,相关切图属于苏宁所有。

效果图

这里写图片描述

这里写图片描述

这里写图片描述

代码

LotteryDemo.cpp

#include "lotterydemo.h"
#include <QPainter>
#include <QPixmap>
#include <QTime>
#include <QMouseEvent>
#include <QDebug>
#include <QPropertyAnimation>
#include <QMessageBox>
#include "commonmaskwidget.h"

QString LottertData[] = { QStringLiteral("Iphone手机"), QStringLiteral("IPAD平板"), QStringLiteral("IPAD平板"), QStringLiteral("上海迪士尼门票"), QStringLiteral("上海迪士尼门票"),\
QStringLiteral("剑南春酒文化之旅"), QStringLiteral("剑南春酒文化之旅"), QStringLiteral("古井酒文化之旅"), QStringLiteral("古井酒文化之旅"), QStringLiteral("怡宝定制饮水机"), QStringLiteral("怡宝定制饮水机"),\
QStringLiteral("再来一次"), QStringLiteral("再来一次"), QStringLiteral("谢谢参与"), QStringLiteral("谢谢参与"), QStringLiteral("Iphone手机")
                        };

LotteryDemo::LotteryDemo(QWidget *parent)
    : QWidget(parent)
    , m_rotation(0)
{
    ui.setupUi(this);
    initControl();
}

LotteryDemo::~LotteryDemo()
{

}

void LotteryDemo::initControl()
{
    qsrand(QTime(0, 0, 0).secsTo(QTime::currentTime()));
    setMouseTracking(true);
}

int LotteryDemo::getRotate()
{
    return m_rotation;
}

void LotteryDemo::setRotate(int rotate)
{
    m_rotation = rotate;
    update();
}

void LotteryDemo::paintEvent(QPaintEvent* event)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::SmoothPixmapTransform, true);
    painter.save();
    //窗口宽、高
    int nWindowWidth = this->width();
    int nWindowHeight = this->height();
    //背景图
    QPixmap pixmap = QPixmap(":/LotteryDemo/Resources/back.png");
    //中心偏移至中心位置
    painter.translate(nWindowWidth / 2, nWindowHeight / 2);
    //旋转m_rotation角度
    painter.rotate(-1 * m_rotation);
    painter.drawPixmap(QRect(0 - nWindowWidth / 2, 0 - nWindowHeight / 2, pixmap.width(), pixmap.height()), pixmap);
    painter.restore();
    //绘制方向指针
    QPixmap pointer = QPixmap(":/LotteryDemo/Resources/pointer.png");
    m_pointerRect = QRect((nWindowWidth - pointer.width()) / 2, (nWindowHeight - pointer.height() - 30) / 2, pointer.width(), pointer.height());
    painter.drawPixmap(m_pointerRect, pointer);
    __super::paintEvent(event);
}

void LotteryDemo::mousePressEvent(QMouseEvent *event)
{
    if (qApp->mouseButtons() == Qt::LeftButton)
    {
        QRegion ellipseRegion(m_pointerRect, QRegion::Ellipse);
        if (ellipseRegion.contains(event->pos()))
        {
            int rotateRand = qrand() % 360 + 360 * 5;
            m_rotation = 0;
            QPropertyAnimation *animation = new QPropertyAnimation(this, "rotate");
            animation->setEasingCurve(QEasingCurve::OutCubic);
            animation->setDuration(5000);
            animation->setStartValue(0);
            animation->setEndValue(rotateRand);

            connect(animation, SIGNAL(finished()), this, SLOT(onRotateFinished()));
            animation->start(QAbstractAnimation::DeleteWhenStopped);
        }

    }
    __super::mousePressEvent(event);
}

void LotteryDemo::mouseMoveEvent(QMouseEvent *event)
{
    QRegion ellipseRegion(m_pointerRect, QRegion::Ellipse);
    if (ellipseRegion.contains(event->pos()))
    {
        setCursor(Qt::PointingHandCursor);
    }
    else
    {
        setCursor(Qt::ArrowCursor);
    }
    __super::mouseMoveEvent(event);
}

void LotteryDemo::onRotateFinished()
{
    float rotation = m_rotation - 360 * 5;
    int currentIndex = 0;
    for (int index = 0; index < 16; index++)
    {
        rotation -= 22.5;
        if (rotation <= 0)
        {
            currentIndex = index;
            break;
        }
    }

    QMessageBox msgBox;
    QString message = QStringLiteral("恭喜您中奖:%1 !").arg(LottertData[currentIndex]);
    msgBox.setText(message);
    msgBox.exec();
}

LotteryDemo.h

#ifndef LOTTERYDEMO_H
#define LOTTERYDEMO_H

#include <QtWidgets/QWidget>
#include "ui_lotterydemo.h"

class LotteryDemo : public QWidget
{
    Q_OBJECT
    Q_PROPERTY(int rotate READ getRotate WRITE setRotate)

public:
    LotteryDemo(QWidget *parent = 0);
    ~LotteryDemo();

private:
    void initControl();

public:
    int getRotate();
    void setRotate(int rotate);

private slots:
    void onRotateFinished();

private:
    void paintEvent(QPaintEvent*);// 绘制事件
    void mousePressEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);

private:
    Ui::LotteryDemoClass ui;
    int m_rotation;
    QRect m_pointerRect;
};

#endif // LOTTERYDEMO_H

结尾

全部代码,都在上面了,希望对大伙有所点启发和帮助,只为记录,只为分享! 愿所写能对你有所帮助。不忘记点个赞,谢谢~

需要工程文件的,可以加我QQ工作号,因权限问题,暂时不能邮箱。

猜你喜欢

转载自blog.csdn.net/ly305750665/article/details/79273799