qt抽奖(Qt如何编写自定义控件实现抽奖转盘)

发布时间:2025-12-11 00:48:27 浏览次数:14

具体代码如下

#ifndefLOTTERYTURNTABLEWIDGET_H#defineLOTTERYTURNTABLEWIDGET_H#include<QWidget>classLotteryTurntableWidget:publicQWidget{Q_OBJECTQ_PROPERTY(introtateREADgetRotateWRITEsetRotateMEMBERpainterRotate)public:LotteryTurntableWidget(QWidget*parent=nullptr);~LotteryTurntableWidget()override;intgetRotate();voidsetRotate(introtate);protected:voidpaintEvent(QPaintEvent*event)override;voidmousePressEvent(QMouseEvent*event)override;voidmouseReleaseEvent(QMouseEvent*event)override;private:QRectcenterBtnRect;boolisPressCenterBtn{false};boolisRuning{false};intpainterRotate{0};voidonRotateFinished();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(){}intLotteryTurntableWidget::getRotate(){returnpainterRotate;}voidLotteryTurntableWidget::setRotate(introtate){painterRotate=rotate;update();}voidLotteryTurntableWidget::paintEvent(QPaintEvent*event){QPainterpainter(this);painter.setRenderHint(QPainter::Antialiasing,true);//反走样开启constautorect=event->rect();autoradius=std::min(rect.width(),rect.height())/2-25;painter.save();painter.translate(rect.center());//将坐标系的原点设置为(r,r)QPenpen;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(inti=0;i<20;++i){painter.rotate(18.0);intsmallEllipse;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;autocenterRect=QRect(-radius,-radius,radius*2,radius*2);painter.setPen(Qt::transparent);painter.save();painter.rotate(18.0*painterRotate);for(inti=0;i<8;++i){QPainterPathpath;path.moveTo(0,0);path.arcTo(centerRect,45*i,45);path.closeSubpath();painter.fillPath(path,colorList[i]);}painter.restore();QPainterPathtrianglePath;//三角形QPolygonpolygon;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();}voidLotteryTurntableWidget::mousePressEvent(QMouseEvent*event){if(isRuning){QWidget::mousePressEvent(event);return;}QRegionellipseRegion(centerBtnRect,QRegion::Ellipse);isPressCenterBtn=ellipseRegion.contains(event->pos());if(isPressCenterBtn){isRuning=true;QPropertyAnimation*animation=newQPropertyAnimation(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);}voidLotteryTurntableWidget::mouseReleaseEvent(QMouseEvent*event){if(isPressCenterBtn){isPressCenterBtn=false;update();}QWidget::mouseReleaseEvent(event);}voidLotteryTurntableWidget::onRotateFinished(){isRuning=false;}

效果:

读到这里,这篇“Qt如何编写自定义控件实现抽奖转盘”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注本站行业资讯频道。

qt抽奖
需要做网站?需要网络推广?欢迎咨询客户经理 13272073477