Qt编写自定义控件实现抽奖转盘
本文实例为大家分享了Qt自定义控件实现抽奖转盘的具体代码,供大家参考,具体内容如下
#ifndef LOTTERYTURNTABLEWIDGET_H
#define LOTTERYTURNTABLEWIDGET_H
#include <QWidget>
class LotteryTurntableWidget : public QWidget
{
Q_OBJECT
Q_PROPERTY(int rotate READ getRotate WRITE setRotate MEMBER painterRotate)
public:
LotteryTurntableWidget(QWidget *parent = nullptr);
~LotteryTurntableWidget()override;
int getRotate();
void setRotate(int rotate);
protected:
void paintEvent(QPaintEvent *event)override;
void mousePressEvent(QMouseEvent *event)override;
void mouseReleaseEvent(QMouseEvent *event)override;
private:
QRect centerBtnRect;
bool isPressCenterBtn{false};
bool isRuning{false};
int painterRotate{0};
void onRotateFinished();
QList<Qt::GlobalColor> colorList;
};
#endif // LOTTERYTURNTABLEWIDGET_H
#include "lotteryturntablewidget.h"
#include <QPainter>
#include <QPaintEvent>
#include <QPainterPath>
#include <QTime>
#include <QDebug>
#include <QRandomGenerator>
#include <QPropertyAnimation>
LotteryTurntableWidget::LotteryTurntableWidget(QWidget *parent)
: QWidget(parent)
{
setPalette(Qt::white);
setMinimumSize(500,500);
colorList << Qt::red << Qt::yellow << Qt::green << Qt::cyan << Qt::blue << Qt::magenta << Qt::darkGreen << Qt::darkCyan;
}
LotteryTurntableWidget::~LotteryTurntableWidget()
{
}
int LotteryTurntableWidget::getRotate()
{
return painterRotate;
}
void LotteryTurntableWidget::setRotate(int rotate)
{
painterRotate = rotate;
update();
}
void LotteryTurntableWidget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing,true); //反走样开启
const auto rect = event->rect();
auto radius = std::min(rect.width(),rect.height()) / 2 - 25;
painter.save();
painter.translate(rect.center()); //将坐标系的原点设置为(r,r)
QPen pen;
pen.setColor(QColor("#F0630B"));
pen.setWidth(16);
painter.setPen(pen);
painter.drawEllipse(QPoint(0, 0), radius, radius);
pen.setColor(QColor("#FF4500"));
pen.setWidth(8);
painter.setPen(pen);
radius -= 8;
painter.drawEllipse(QPoint(0, 0), radius, radius);
pen.setColor(QColor("#B71606"));
pen.setWidth(40);
painter.setPen(pen);
radius -= 24;
painter.drawEllipse(QPoint(0, 0), radius, radius);
painter.save();
if(!isRuning)
{
painter.setPen(Qt::white);
painter.setBrush(Qt::white);
}
for (int i = 0; i < 20; ++i)
{
painter.rotate(18.0);
int smallEllipse;
if(i % 2 == 0)
{
if(isRuning)
{
if(painterRotate % 2 == 0)
{
painter.setPen(Qt::red);
painter.setBrush(Qt::red);
}
else
{
painter.setPen(Qt::blue);
painter.setBrush(Qt::blue);
}
}
smallEllipse = 15;
}
else
{
if(isRuning)
{
if(painterRotate % 2 == 0)
{
painter.setPen(Qt::blue);
painter.setBrush(Qt::blue);
}
else
{
painter.setPen(Qt::red);
painter.setBrush(Qt::red);
}
}
smallEllipse = 10;
}
painter.drawEllipse(QPoint(radius, 0), smallEllipse, smallEllipse);
}
painter.restore();
pen.setColor(QColor("#FFC228"));
pen.setWidth(20);
painter.setPen(pen);
radius -= 30;
painter.drawEllipse(QPoint(0, 0), radius, radius);
radius -= 10;
auto centerRect = QRect(-radius,-radius,radius * 2,radius * 2);
painter.setPen(Qt::transparent);
painter.save();
painter.rotate(18.0 * painterRotate);
for (int i = 0;i < 8;++i)
{
QPainterPath path;
path.moveTo(0,0);
path.arcTo(centerRect, 45 * i,45);
path.closeSubpath();
painter.fillPath(path,colorList[i]);
}
painter.restore();
QPainterPath trianglePath;//三角形
QPolyGon polygon;
polygon.append(QPoint(0,-radius * 0.55));
polygon.append(QPoint(-radius * 0.25,0));
polygon.append(QPoint(radius * 0.25,0));
trianglePath.addPolygon(polygon);
painter.setBrush(QColor("#EEDAA2"));
painter.drawPath(trianglePath);
painter.setBrush(QColor("#FDFAEA"));
radius = static_cast<int>(radius * 0.3);
painter.drawEllipse(QPoint(0, 0), radius, radius);
painter.setBrush(isPressCenterBtn ? QColor("#B91A0D").lighter() : QColor("#B91A0D"));//中间的按钮
radius -= 2;
painter.drawEllipse(QPoint(0, 0), radius, radius);
centerBtnRect = QRect(rect.width() / 2 - radius,rect.height() / 2 - radius,radius * 2,radius * 2);
painter.restore();
}
void LotteryTurntableWidget::mousePressEvent(QMouseEvent *event)
{
if(isRuning)
{
QWidget::mousePressEvent(event);
return;
}
QRegion ellipseRegion(centerBtnRect, QRegion::Ellipse);
isPressCenterBtn = ellipseRegion.contains(event->pos());
if(isPressCenterBtn)
{
isRuning = true;
QPropertyAnimation *animation = new QPropertyAnimation(this, "rotate");
animation->setEasinGCurve(QEasingCurve::InOutCubic);
animation->setDuration(3000);
animation->setStartValue(0);
animation->setEndValue(QRandomGenerator::global()->bounded(360) + 360 * 5);
connect(animation, &QAbstractAnimation::finished, this, &LotteryTurntableWidget::onRotateFinished);
animation->start(QAbstractAnimation::DeleteWhenStopped);
update();
}
QWidget::mousePressEvent(event);
}
void LotteryTurntableWidget::mouseReleaseEvent(QMouseEvent *event)
{
if(isPressCenterBtn)
{
isPressCenterBtn = false;
update();
}
QWidget::mouseReleaseEvent(event);
}
void LotteryTurntableWidget::onRotateFinished()
{
isRuning = false;
}
效果:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
相关文章