import numpy as np
from PySide6.QtCore import QRect, Qt, QTimer, QPointF
from PySide6.QtGui import QFont, QBrush, QColor, QPainter, QPainterPath, QPen, QLinearGradient, QConicalGradient, QPolygonF, QPointFList
from PySide6.QtWidgets import QApplication, QFrame, QPushButton, QWidget, QLineEdit, QGraphicsBlurEffect, QLabel
import math
import PySide6
import math
class ButtonPush4(QFrame):
def __init__(self, parent = None):
super(ButtonPush4, self).__init__(parent)
self.ui()
def ui(self):
self.setGeometry(QRect(0, 0, 300, 300));
self.timer = QTimer(self);
self.timer.timeout.connect(self.slot_time_out)
self.timer.start(150)
self.cur_height = 0
def slot_time_out(self):
self.cur_height += 4
if( self.cur_height >= min( self.height(), self.width())):
self.cur_height = 0
self.update()
def paintEvent(self, event):
super(ButtonPush4, self).paintEvent(event);
painter = QPainter(self)
brush = QBrush(QColor(0, 0, 0, 0));
# painter.setBrush(brush);
painter.fillRect(self.rect(), brush);
path = QPainterPath()
r = min([ self.width(), self.height()])
path.addEllipse( 0, 0, r, r);
painter.setRenderHint(QPainter.Antialiasing)
painter.setPen(Qt.NoPen)
painter.setClipPath(path)
y_offset = self.height() - self.cur_height
y = np.sin( 2 * np.pi * np.linspace(0, 10, 3)/10 + np.random.random(1)) * 10 + y_offset
x = np.arange( len(y) ) * self.width()/( len(y) -1);
path = QPainterPath( QPointF( x[0], y[0]));
for i in range( len(y) - 1):
sp = QPointF( x[i], y[i])
ep = QPointF( x[i+1], y[i +1])
c1 = QPointF( (sp.x() + ep.x())/2 , sp.y())
c2 = QPointF( (sp.x() + ep.x())/2, ep.y())
path.cubicTo( c1, c2, ep);
path.lineTo( QPointF( self.width(), self.height()))
path.lineTo( QPointF( 0, self.height()))
path.lineTo( QPointF( 0, y_offset))
pen = QPen( QColor(255, 255, 0))
pen.setWidth(1)
painter.setPen( pen)
painter.setBrush( QBrush(QColor(125, 125,255)))
painter.drawPath(path)
if __name__ == '__main__':
app = QApplication()
w = QWidget();
w.resize(300, 300)
# w.setStyleSheet('QWidget{background-color:#000000}')
btn = ButtonPush4(w)
w.show()
app.exec()
效果图如下: