Qt编写自定义控件实现抽奖转盘

Oria ·
更新时间:2024-09-21
· 865 次阅读

本文实例为大家分享了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; }

效果:



自定义 自定义控件 抽奖转盘

需要 登录 后方可回复, 如果你还没有账号请 注册新账号
相关文章