Qt自定义控件9:波浪进度条1
先看效果图:
思路:利用QPaintPath画出封闭路径,填充颜色,圆弧使用正弦函数,根据横坐标递增,画出正弦函数线。
关键代码:
void WaterProgressBar1::paintEvent(QPaintEvent *event){
int width = this->width();
int height = this->height();
int side = qMin(width, height);
QPainter painter(this);
painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
// painter.translate(width / 2, height / 2);
painter.scale(side / 200.0, side / 200.0);
drawBg(&painter);
drawWater(&painter);
}
void WaterProgressBar1::updateValue(float va){
this->value = va;
update();
}
void WaterProgressBar1::drawWater(QPainter* painter){
int startX = 0;
int startY = 0;
int endX = this->width();
int endY = this->height();
float height = endY-(float)endY*(this->value/100);
QPainterPath waterPath1;
waterPath1.moveTo(startX,endY);
QPainterPath waterPath2;
waterPath2.moveTo(startX,endY);
for(int i = 0;i<=endX;i++){
float y1,y2;
y1 = 15*qSin(0.035*i+offset)+height; //第一条正弦函数路径
y2 = 15*qSin(0.035*i+30+offset)+height;//第二条正弦函数路径
if(value == 0){//作极数处理
y1 = y2 = endY;
}
if(value == 100){//作极数处理
y1 = y2 = 0;
}
waterPath1.lineTo(i,y1);
waterPath2.lineTo(i,y2);
}
waterPath1.lineTo(endX,endY);
waterPath2.lineTo(endX,endY);
painter->save();
painter->setPen(Qt::NoPen);
painter->setBrush(QColor("#824848"));
painter->drawPath(waterPath2);
painter->setBrush(QColor("#E36363"));
painter->drawPath(waterPath1);
painter->restore();
}
void WaterProgressBar1::drawBg(QPainter* painter){
painter->save();
painter->setBrush(QColor(bgColor));
painter->drawRect(this->rect());
painter->restore();
}