这篇文章主要为大家详细介绍了夸脱编写自定义控件实现抽奖转盘,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
本文实例为大家分享了夸脱自定义控件实现抽奖转盘的具体代码,供大家参考,具体内容如下
# IFN def LOTTERYTURNTABLEWIDGET _ H
#定义LOTTERYTURNTABLEWIDGET_H
#包含QWidget
类LotteryTurntableWidget:公共q小部件
{
q _对象
q _ PROPERTY(int rotate READ get rotate WRITE set rotate MEMBER painter rotate)
公共:
LotteryTurntableWidget(q widget * parent=nullptr);
~LotteryTurntableWidget()覆盖;
int get rotate();
void set rotate(int rotate);
受保护:
void paint事件(qpaint事件*事件)覆盖;
void mousePressEvent(QMouseEvent *事件)覆盖;
void mouseReleaseEvent(QMouseEvent *事件)覆盖;
私人:
质量中心BTN质量。
bool isPressCenterBtn { false };
bool正在运行{ false };
int painter rotate { 0 };
void onRotateFinished();
qlist Qt:全局颜色颜色列表;
};
# endif//LOTTERYTURNTABLEWIDGET _ H
# include ' lotteryturntablewidget。' h '
#包括q画师
#包含QPaintEvent
#包含QPainterPath
#包含QTime
#包含QDebug
#包含随机发电机
#包含qpropertymanimation
LotteryTurntableWidget:LotteryTurntableWidget(q widget * parent)
:QWidget(父级)
{
设置调色板(Qt:white);
setMinimumSize(500,500);
颜色列表Qt:红色Qt:黄色Qt:绿色Qt:青色Qt:蓝色Qt:品红色Qt:暗绿色Qt:暗青色;
}
LotteryTurntableWidget:~ LotteryTurntableWidget()
{
}
int LotteryTurntableWidget:get rotate()
{
返回油漆旋转
}
void LotteryTurntableWidget:set rotate(int rotate)
{
painterRotate=旋转
update();
}
void LotteryTurntableWidget:paint事件(QPaintEvent * event)
{
q画师画师(这个);
painter.setRenderHint(QPainter:抗锯齿,真);//反走样开启
const auto rect=event-rect();
auto radius=std:min(rect.width()、rect。height())/2-25;
画家。save();
画家。翻译(rect。center());//将坐标系的原点设置为(r,r)
QPen笔;
钢笔。设置颜色(q color(' # f 0630 b ');
钢笔。设置宽度(16);
painter.setPen(钢笔);
painter.drawEllipse(QPoint(0,0),radius,radius);
钢笔。设置颜色(q color(' # ff 4500 ');
钢笔。设置宽度(8);
painter.setPen(钢笔);
半径-=8;
painter.drawEllipse(QPoint(0,0),radius,radius);
钢笔。设置颜色(QColor(# b 71606));
钢笔。设置宽度(40);
painter.setPen(钢笔);
半径-=24;
painter.drawEllipse(QPoint(0,0),radius,radius);
画家。save();
如果(!正在运行)
{
画家。set pen(Qt:white);
画家。套刷(Qt:白色);
}
for(int I=0;i 20我)
{
画家。旋转(18.0);
int小椭圆
如果(i % 2==0)
{
如果(正在运行)
{
if(painterRotate % 2==0)
{
画家。set pen(Qt:red);
画家。套刷(Qt:red);
}
其他
{
画家。set pen(Qt:blue);
画家。套刷(Qt:蓝色);
}
}
小椭圆=15
}
其他
{
如果(正在运行)
{
if(painterRotate % 2==0)
{
画家。set pen(Qt:blue);
画家。套刷(Qt:蓝色);
}
其他
{
画家。set pen(Qt:red);
画家。套刷(Qt:red);
}
}
小椭圆=10
}
painter.drawEllipse(QPoint(半径,0),小椭圆,小椭圆);
}
画家。restore();
钢笔。设置颜色(q color(' # ffc 228 '));
钢笔。设置宽度(20);
painter.setPen(钢笔);
半径-=30;
painter.drawEllipse(QPoint(0,0),radius,radius);
半径-=10;
auto centerRect=QRect(-radius,-radius,radius * 2,radius * 2);
画家。set pen(Qt:transparent);
画家。save();
画家。旋转(18.0 *画家旋转);
for(int I=0;I 8;我)
{
QPainterPath路径;
path.moveTo(0,0);
path.arcTo(centerRect,45 * i,45);
路径。closesubpath();
painter.fillPath(path,color list[I]);
}
画家。restore();
QPainterPath trianglePath//三角形
q多边形多边形;
polygon.append(QPoint(0,-radius * 0.55));
多边形。append(q点(-半径* 0.25,0));
多边形。append(q点(半径* 0.25,0));
trianglePath.addPolygon(多边形);
画家。设置画笔(q色(# eeda a2));
画家。绘制路径(三角形路径);
画家。设置画笔(q色(' # FDFAEA '));
radius=static_castint(半径* 0.3);
painter.drawEllipse(QPoint(0,0),radius,radius);
画家。设置画笔(isPressCenterBtn?QColor('#B91A0D ').打火机():q色(' # b91a 0d ');//中间的按钮
半径-=2;
painter.drawEllipse(QPoint(0,0),radius,radius);
centerBtnRect=QRect(rect。width()/2-radius,rect.height()/2 - radius,radius * 2,radius * 2);
画家。restore();
}
void LotteryTurntableWidget:mousePressEvent(QMouseEvent * event)
{
如果(正在运行)
{
QWidget:mousePressEvent(事件);
返回;
}
QRegion椭圆区域(centerBtnRect,QRegion:Ellipse);
isPressCenterBtn=ellipseregie。包含(event-pos());
if(isPressCenterBtn)
{
isRuning=true
qpropertymanimation * animation=new qpropertymanimation(this,' rotate ');
animation-setEasingCurve(QEasingCurve:inout cubic);
动画-设置持续时间(3000);
animation-setStartValue(0);
animation-setEndValue(QRandomGenerator:global()-bounded(360)360 * 5);
connect(animation,qabstractanmation:finished,this,LotteryTurntableWidget:onRotateFinished);
animation-start(qabstractanmation:deletewhentstopped);
update();
}
QWidget:mousePressEvent(事件);
}
void LotteryTurntableWidget:mouseReleaseEvent(QMouseEvent * event)
{
if(isPressCenterBtn)
{
isPressCenterBtn=false
update();
}
QWidget:mouseReleaseEvent(事件);
}
void LotteryTurntableWidget:onRotateFinished()
{
isRuning=false
}
效果:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。