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工作号,因权限问题,暂时不能邮箱。