pyside6自定义水波纹控件


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())

你可能感兴趣的:(pyqt)