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

python 复制代码
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()

效果图如下:

相关推荐
threelab36 分钟前
Three.js 咖啡杯烟雾效果 | 三维可视化 / AI 提示词
开发语言·javascript·人工智能
初心未改HD1 小时前
gRPC 与 Protobuf 实战指南
开发语言·golang
2zcode1 小时前
基于MATLAB的交通流量预测模型设计与实现
开发语言·matlab·交通流量预测
早日退休!!!1 小时前
操作系统锁
java·开发语言
lsx2024061 小时前
Python 统计学基础与高级应用
开发语言
研究点啥好呢1 小时前
快手多模态算法工程师面试题精选:10道高频考题+答案解析
java·开发语言·人工智能·ai·面试·笔试
xxjj998a1 小时前
PHP vs C#:核心差异全解析
开发语言·c#·php
遗憾随她而去.1 小时前
Java学习(一)
java·开发语言·学习
kyriewen111 小时前
代码写成一锅粥?3个设计模式让你的项目“起死回生”
开发语言·前端·javascript·设计模式·ecmascript
陌路物是人非1 小时前
记一个controller入参为null的奇怪问题
java·开发语言