QT自定義ProgressBar
圓角進度條
QT自帶的進度條,設置qss樣式border-radius: 15px;
,會有一個問題,進度條剛開始進度爲1%時,由於進度條的寬度小於radius的大小,剛開始的進度條並不是圓角的,而是方角的,爲了解決這個問題,自定義類QProgressBar
,對paintEvent(QPaintEvent*e)
進行重載,重新繪製進度條。
實現效果:
void ProgressBar::paintEvent(QPaintEvent *e)
{
//height-40px;
QPainter painter(this);
QPainterPath draw_path;
int radius=20;
double percent=static_cast<double>(value())/static_cast<double>(maximum());
percent=percent/15;
painter.setRenderHint(QPainter::Antialiasing);
while (radius*2>height()) {
radius--;
}
draw_path.clear();
draw_path.moveTo(radius,0);
draw_path.arcTo(QRect(0,0,radius*2,radius*2),90,90);
draw_path.lineTo(0,height()-radius);
draw_path.arcTo(QRect(0,0,radius*2,radius*2),180,90);
draw_path.lineTo(width()-radius,height());
draw_path.arcTo(QRect(width()-radius*2,0,radius*2,radius*2),270,90);
draw_path.lineTo(width(),radius);
draw_path.arcTo(QRect(width()-radius*2,0,radius*2,radius*2),0,90);
draw_path.lineTo(radius,0);
if(value()>0){
painter.fillPath(draw_path,QColor("#D8D8D8"));
}else{
painter.fillPath(draw_path,Qt::transparent); //若進度位0%,進度條自動隱身
}
draw_path.clear();
double x_move=(percent*width());
double theta=acos(abs(x_move-radius)/radius);
double y_move=(sin(theta)*radius);
if(percent*width()<=radius){
draw_path.moveTo(x_move,radius-y_move);
draw_path.arcTo(QRect(0,0,radius*2,radius*2),static_cast<int>(180-theta/M_PI*180),static_cast<int>(theta/M_PI*180));
draw_path.arcTo(QRect(0,0,radius*2,radius*2),180,static_cast<int>(theta/M_PI*180));
draw_path.lineTo(static_cast<int>(x_move),static_cast<int>(radius-y_move));
// painter.setPen(QColor(0, 0, 0));
// painter.drawArc(QRect(0,0,radius*2,radius*2),static_cast<int>(180-theta/M_PI*180)*16,static_cast<int>(theta/M_PI*180)*16);
// painter.drawArc(QRect(0,0,radius*2,radius*2),180*16,static_cast<int>(theta/M_PI*180)*16);
// painter.drawLine(QPointF(x_move,radius+y_move),QPointF(x_move,radius-y_move));
}
else if(percent*width()<radius*2){
draw_path.moveTo(radius,0);
draw_path.arcTo(QRect(0,0,radius*2,radius*2),90,90);
draw_path.arcTo(QRect(0,0,radius*2,radius*2),180,90);
draw_path.arcTo(QRect(0,0,radius*2,radius*2),270,static_cast<int>(90-theta/M_PI*180));
draw_path.lineTo(static_cast<int>(x_move),static_cast<int>(radius-y_move));
draw_path.arcTo(QRect(0,0,radius*2,radius*2),90-static_cast<int>(90-theta/M_PI*180),static_cast<int>(90-theta/M_PI*180));
// painter.setPen(QColor(0, 0, 0));
// painter.drawArc(QRect(0,0,radius*2,radius*2),90*16,90*16);
// painter.drawArc(QRect(0,0,radius*2,radius*2),180*16,90*16);
// painter.drawArc(QRect(0,0,radius*2,radius*2),270*16,static_cast<int>(90-theta/M_PI*180)*16);
// painter.drawLine(QPointF(x_move,radius+y_move),QPointF(x_move,radius-y_move));
// painter.drawArc(QRect(0,0,radius*2,radius*2),(90-static_cast<int>(90-theta/M_PI*180))*16,static_cast<int>(90-theta/M_PI*180)*16);
}else{
qDebug()<<"3"<<percent;
draw_path.moveTo(radius,0);
draw_path.arcTo(QRect(0,0,radius*2,radius*2),90,90);
draw_path.lineTo(0,height()-radius*2);
draw_path.arcTo(QRect(0,0,radius*2,radius*2),180,90);
draw_path.lineTo(percent*width()-radius*2,height());
draw_path.arcTo(QRect(static_cast<int>(percent*width())-radius*2,0,radius*2,radius*2),270,90);
draw_path.lineTo(percent*width(),radius*2);
draw_path.arcTo(QRect(static_cast<int>(percent*width()-radius*2),0,radius*2,radius*2),0,90);
draw_path.lineTo(radius*2,0);
}
painter.fillPath(draw_path,QColor("#67B5B7"));
}