Qt 自定义 浮动水面 效果 进度条

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

效果图如下:

Qt 自定义 浮动水面 效果 进度条_第1张图片

 

你可能感兴趣的:(QT,qt,开发语言)