from PySide6 import QtWidgets,QtCore,QtGui
import math
from PySide6.QtCore import Qt
class Ui(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.resize(600,600)
self.offset = 0
self.max_value = 100
self.min_value = 0
self.cur_calue=30
self.timer = QtCore.QTimer(self)
self.timer.timeout.connect(self.timer_fun)
self.timer.start(50)
def timer_fun(self):
self.offset+=5
if self.offset>self.width():
self.offset = 0
self.update()
def paintEvent(self, event):
painter = QtGui.QPainter(self)
painter.setRenderHint(QtGui.QPainter.RenderHint.Antialiasing,True)
path = QtGui.QPainterPath()
painter.setClipPath(path)
#创建可见路径
clipath = QtGui.QPainterPath()
clipath.addEllipse(self.rect().center(),self.height()/2-20,self.height()/2-20)
painter.setClipPath(clipath)
for i in range(int(self.width())):
if i ==0:
# path.moveTo(i,20*math.sin(i))
path.moveTo(i,20*math.sin(4*math.pi/self.width()*i+self.offset)+self.height()-(self.height()/(self.max_value-self.min_value)*self.cur_calue)) #左加右减,上加下减
else:
path.lineTo(i,20*math.sin(4*math.pi/self.width()*i+self.offset)+self.height()-(self.height()/(self.max_value-self.min_value)*self.cur_calue))
path.lineTo(self.rect().bottomRight())
path.lineTo(self.rect().bottomLeft())
path.closeSubpath()#将最后一个点和起点连接起来,形成闭合曲线
painter.setPen(QtGui.Qt.NoPen)
painter.setBrush(QtGui.Qt.cyan)
painter.drawPath(path)
painter.setPen(QtGui.QPen(QtGui.Qt.red,5))
painter.setBrush(QtGui.Qt.NoBrush)
painter.drawEllipse(self.rect().center(),self.height()/2-20,self.height()/2-20)
painter.drawText(self.rect(),Qt.AlignmentFlag.AlignCenter,f"{self.cur_calue}%")
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
win = Ui()
win.show()
sys.exit(app.exec())
pyside6自定义水波纹控件
最新推荐文章于 2024-04-23 09:34:40 发布