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

效果图如下:

相关推荐
我要升天!9 小时前
QT -- 初识
开发语言·qt
wjs202410 小时前
Memcached flush_all 命令详解
开发语言
zbhbbedp282793cl10 小时前
unique_ptr和shared_ptr有何区别?
java·开发语言·jvm
.NET修仙日记10 小时前
第四章:C# 面向对象编程详解:从类与对象到完整项目实践
开发语言·c#·.net·源码·教程·.net core
m0_7381207210 小时前
内网横向靶场——记录一次横向渗透(三)
开发语言·网络·安全·web安全·网络安全·php
songroom10 小时前
Rust: 量化策略回测与简易线程池构建、子线程执行观测
开发语言·后端·rust
jz_ddk10 小时前
[数学基础] 瑞利分布:数学原理、物理意义及Python实验
开发语言·python·数学·概率论·信号分析
大G的笔记本10 小时前
Java JVM 篇常见面试题
java·开发语言·jvm
ZHE|张恒11 小时前
深入理解 Java 双亲委派机制:JVM 类加载体系全解析
java·开发语言·jvm