#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QWidget>
#include<QPainter>
#include<QTimer>
class MyWidget : public QWidget
{
Q_OBJECT
public:
explicit MyWidget(QWidget *parent = nullptr);
signals:
protected:
void paintEvent(QPaintEvent *event) override;
private:
QTimer *timer;
int offset=0;
int maxval=100;
int minval=0;
int currval=30;
};
#endif // MYWIDGET_H
#include "mywidget.h"
#include<QtMath>
#include<QtDebug>
MyWidget::MyWidget(QWidget *parent) : QWidget(parent)
{
timer = new QTimer(this);
connect(timer,&QTimer::timeout,this,[=](){
offset+=5;
update();
if (offset>width()){
offset = 0;
}
});
timer->start(100);
}
void MyWidget::paintEvent(QPaintEvent *event){
Q_UNUSED(event);
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing,true);
QPainterPath showpath;
showpath.addEllipse(this->rect().center(),height()/2-20,height()/2-20);
painter.setClipPath(showpath);//设置可见区域
QPainterPath path;
for (int i =0;i<width();i++) {
if (i==0){
path.moveTo(i,20*qSin(4*M_PI/width()*i-offset)+height()-height()/(maxval-minval)*currval);
}else{
path.lineTo(i,20*qSin(4*M_PI/width()*i-offset)+height()-height()/(maxval-minval)*currval);
}
}
path.lineTo(this->rect().bottomRight());
path.lineTo(this->rect().bottomLeft());
path.closeSubpath();
painter.setPen(Qt::NoPen);
painter.setBrush(Qt::green);
painter.drawPath(path);
//绘制圆形
painter.setPen(QPen(Qt::red,5));
painter.setBrush(Qt::NoBrush);
painter.drawEllipse(this->rect().center(),height()/2-20,height()/2-20);
painter.setFont(QFont("楷体",30));
painter.drawText(this->rect(),Qt::AlignCenter,QString::number(currval)+"%");
}
//闭合
python实现
import sys
from PySide6.QtWidgets import *
from PySide6.QtCore import *
from PySide6.QtGui import *
import math
class DynamicWaterRipple(QWidget):
def __init__(self,*args,**kwargs):
super().__init__(*args,**kwargs)
self.timer = QTimer(self)
self.timer.timeout.connect(self._on_timer)
self._offset = 0
self.timer.start(150)
self._maxval = 100
self._minval = 0
self._curval = 60
def _on_timer(self):
self._offset+=5;
if self._offset>self.width():
self._offset =0
self.update()
def paintEvent(self, event):
painter = QPainter(self)
painter.setRenderHint(QPainter.RenderHint.Antialiasing,True)
showpath = QPainterPath()
showpath.addEllipse(self.rect().center(),self.height()/2-18,self.height()/2-18)
painter.setClipPath(showpath)
path = QPainterPath()
for i in range(self.width()):
if i==0:
path.moveTo(i,20*math.sin(i*4*math.pi/self.width()+self._offset)+self.height()-self.height()/(self._maxval-self._minval)*self._curval)
else:
path.lineTo(i,20*math.sin(i*4*math.pi/self.width()+self._offset)+self.height()-self.height()/(self._maxval-self._minval)*self._curval)
path.lineTo(self.rect().bottomRight())
path.lineTo(self.rect().bottomLeft())
path.closeSubpath()
painter.setBrush(Qt.cyan)
painter.setPen(Qt.PenStyle.NoPen)
painter.drawPath(path)
# 绘制圆
painter.setPen(QPen(Qt.red,5))
painter.setBrush(Qt.BrushStyle.NoBrush)
painter.drawEllipse(self.rect().center(),self.height()/2-20,self.height()/2-20)
painter.setFont(QFont("楷体",30))
painter.drawText(self.rect(),Qt.AlignmentFlag.AlignCenter,f"{self._curval}%")
if __name__ == '__main__':
app = QApplication(sys.argv)
win = DynamicWaterRipple()
win.show()
sys.exit(app.exec())