#include "waveprogressbar.h" #include WaveProgressBar::WaveProgressBar(QWidget *parent) : QWidget(parent) { timer = new QTimer(this); connect(timer,&QTimer::timeout,this,[=]() { offset += 0.6; if( offset > width() ) offset = 0; update(); }); timer->start(80); } void WaveProgressBar::paintEvent(QPaintEvent *event) { Q_UNUSED(event); QPainter painter(this); painter.setRenderHint( QPainter::Antialiasing, true ); QPainterPath sinPath; painter.save(); painter.setPen( Qt::NoPen ); QLinearGradient liner(0, 0, 0, height()); liner.setColorAt(0.0, QColor(255, 66, 213, 180)); liner.setColorAt(1.0, QColor(43, 74, 255, 180)); painter.setBrush( liner ); painter.translate( 0, height()/2 ); double trick = 4 * M_PI / width(); for(int i=0; i<=width(); ++i) { if( i==0 ) { sinPath.moveTo( i, wave*height() * qSin( trick*i + offset) - value*1.0/100 * height() + height()/2 ); } sinPath.lineTo( i, wave*height() * qSin( trick*i + offset) - value*1.0/100 * height() + height()/2 ); } sinPath.lineTo( width() - 5, height()/2 ); sinPath.lineTo( 0, height() / 2 ); sinPath.closeSubpath(); QPainterPath tmpPath; tmpPath.addEllipse( QPoint( width()/2,0), qMin(width(),height())/2 - wave*height() ,qMin(width(),height())/2 - wave*height() ); QPainterPath drawPath; drawPath = sinPath.intersected( tmpPath ); painter.setPen( Qt::NoPen ); painter.drawPath( drawPath ); QPen pen; pen.setWidth( 4 ); pen.setBrush( liner ); painter.setPen( pen ); painter.setBrush( Qt::NoBrush ); painter.drawPath( tmpPath ); painter.restore(); QFont font = painter.font(); font.setPixelSize( qMin(width(),height())/4 ); font.setBold(true); painter.setFont( font ); pen.setColor( Qt::black ); painter.setPen( pen ); painter.drawText( rect(), Qt::AlignCenter, QString::number(value) + "%" ); } int WaveProgressBar::getValue() const { return value; } void WaveProgressBar::setValue(int value) { this->value = value; update(); }