Qt自定义控件实现圆盘进度条
本文实例为大家分享了Qt圆盘进度条的具体代码,供大家参考,具体内容如下
自定义控件二:圆盘进度条
上效果图:
主要思路:使用qpainter根据图形需求画圆和圆弧,画指针(多边形,指定坐标即可),根据具体的value值旋转坐标系,使指针达到旋转效果,旋转度数是根据value值,总共360度,占比求得。最中间需要画文字上去,每次更新value时调用update()方法,重绘界面。
主要代码:CMPassrate1.cpp
voidCMPassrate1::paintEvent(QPaintEvent*event){
intwidth=this->width();
intheight=this->height();
intside=qMin(width,height);
QPainterpainter(this);
painter.setRenderHints(QPainter::Antialiasing|QPainter::TextAntialiasing);
painter.translate(width/2,height/2);
painter.scale(side/200.0,side/200.0);
//绘制外圆
paintSide(&painter);
paintOutE(&painter);
paintLine(&painter);//绘制刻度线
paintInE(&painter);
paintPoint(&painter);//绘制指针
paintTextE(&painter);//绘制文字所在的圆
paintText(&painter);//绘制文字
paintValue(&painter);//绘制value对应的填充角度
}
voidCMPassrate1::paintSide(QPainter*painter){
intradis=outRadis;
QRectrect(-radis,-radis,radis*2,radis*2);
painter->save();
painter->setBrush(QBrush(QColor("#505050")));
painter->setPen(Qt::NoPen);
painter->drawEllipse(rect);
painter->restore();
}
voidCMPassrate1::paintOutE(QPainter*painter){
intradis=outRadis-side;
QRectrect(-radis,-radis,radis*2,radis*2);
painter->save();
painter->setBrush(QBrush(QColor("#868686")));
painter->setPen(Qt::NoPen);
painter->drawEllipse(rect);
painter->restore();
}
voidCMPassrate1::paintLine(QPainter*painter){
intlineStart=outRadis-3;
painter->save();
painter->setPen(QColor("#868686"));
intrange=360/12;
for(inti=0;i<12;i++){
painter->rotate(range);
painter->drawLine(QPoint(lineStart,0),QPoint(outRadis,0));
}
painter->restore();
}
voidCMPassrate1::paintInE(QPainter*painter){
intradis=inRadis;
QRectrect(-radis,-radis,radis*2,radis*2);
painter->save();
painter->setBrush(QBrush(QColor("#646464")));
painter->setPen(Qt::NoPen);
painter->drawEllipse(rect);
painter->restore();
}
voidCMPassrate1::paintTextE(QPainter*painter){
intradis=23;
QRectrect(-radis,-radis,radis*2,radis*2);
painter->save();
painter->setBrush(QBrush(QColor("#FFFFFF")));
painter->setPen(Qt::NoPen);
painter->drawEllipse(rect);
painter->restore();
}
voidCMPassrate1::paintPoint(QPainter*painter){
painter->save();
constQPointpoints[3]={
QPoint(10,0),
QPoint(-10,0),
QPoint(0,inRadis-5)
};
intrange=((double)value/100)*360;
painter->rotate(range);
painter->setPen(Qt::NoPen);
painter->setBrush(QBrush(QColor("#66CFFF")));
painter->drawConvexPolygon(points,3);
painter->restore();
}
voidCMPassrate1::paintText(QPainter*painter){
intradis=23;
QRectrect(-radis,-radis,radis*2,radis*2);
painter->save();
painter->setBrush(QBrush(QColor("#000000")));
painter->setPen(QPen(QColor("#000000")));
QFontfont=painter->font();
font.setPixelSize(20);
painter->setFont(font);
painter->drawText(rect,Qt::AlignCenter,QString("%1%").arg(QString::number(value)));
painter->restore();
}
voidCMPassrate1::paintValue(QPainter*painter){
intoRandis=outRadis-side;
qDebug()<<"value::"<save();
painter->setBrush(valueColor);
painter->setPen(Qt::NoPen);
painter->drawPath(path);
painter->restore();
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。