Qt用c++/python 分别实现动态水波纹效果

#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>
#include<QPainter>
#include<QTimer>

class MyWidget : public QWidget
{
    Q_OBJECT
public:
    explicit MyWidget(QWidget *parent = nullptr);

signals:
protected:

    void paintEvent(QPaintEvent *event) override;
private:
    QTimer *timer;
    int offset=0;
    int maxval=100;
    int minval=0;
    int currval=30;

};

#endif // MYWIDGET_H
#include "mywidget.h"
#include<QtMath>
#include<QtDebug>

MyWidget::MyWidget(QWidget *parent) : QWidget(parent)
{
    timer = new QTimer(this);
    connect(timer,&QTimer::timeout,this,[=](){
        offset+=5;
        update();
        if (offset>width()){
            offset = 0;
        }
    });
    timer->start(100);

}

void MyWidget::paintEvent(QPaintEvent *event){
    Q_UNUSED(event);
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing,true);

    QPainterPath showpath;
    showpath.addEllipse(this->rect().center(),height()/2-20,height()/2-20);
    painter.setClipPath(showpath);//设置可见区域

    QPainterPath path;
    for (int i =0;i<width();i++) {
        if (i==0){
            path.moveTo(i,20*qSin(4*M_PI/width()*i-offset)+height()-height()/(maxval-minval)*currval);
        }else{
            path.lineTo(i,20*qSin(4*M_PI/width()*i-offset)+height()-height()/(maxval-minval)*currval);
        }
    }
       path.lineTo(this->rect().bottomRight());
       path.lineTo(this->rect().bottomLeft());
       path.closeSubpath();
       painter.setPen(Qt::NoPen);
       painter.setBrush(Qt::green);
       painter.drawPath(path);

       //绘制圆形
       painter.setPen(QPen(Qt::red,5));
       painter.setBrush(Qt::NoBrush);
       painter.drawEllipse(this->rect().center(),height()/2-20,height()/2-20);

       painter.setFont(QFont("楷体",30));
       painter.drawText(this->rect(),Qt::AlignCenter,QString::number(currval)+"%");

}

//闭合

python实现

import sys
from PySide6.QtWidgets import *
from PySide6.QtCore import *
from PySide6.QtGui import *
import math



class DynamicWaterRipple(QWidget):
    def __init__(self,*args,**kwargs):
        super().__init__(*args,**kwargs)
        self.timer = QTimer(self)
        self.timer.timeout.connect(self._on_timer)
        self._offset = 0
        self.timer.start(150)

        self._maxval = 100
        self._minval = 0
        self._curval = 60

    def _on_timer(self):
        self._offset+=5;
        if self._offset>self.width():
            self._offset =0
        self.update()

    def paintEvent(self, event):
        painter = QPainter(self)
        painter.setRenderHint(QPainter.RenderHint.Antialiasing,True)

        showpath = QPainterPath()
        showpath.addEllipse(self.rect().center(),self.height()/2-18,self.height()/2-18)
        painter.setClipPath(showpath)

        path = QPainterPath()

        for i in range(self.width()):
            if i==0:
                path.moveTo(i,20*math.sin(i*4*math.pi/self.width()+self._offset)+self.height()-self.height()/(self._maxval-self._minval)*self._curval)
            else:
                path.lineTo(i,20*math.sin(i*4*math.pi/self.width()+self._offset)+self.height()-self.height()/(self._maxval-self._minval)*self._curval)

        path.lineTo(self.rect().bottomRight())
        path.lineTo(self.rect().bottomLeft())
        path.closeSubpath()
        painter.setBrush(Qt.cyan)
        painter.setPen(Qt.PenStyle.NoPen)
        painter.drawPath(path)

#         绘制圆
        painter.setPen(QPen(Qt.red,5))
        painter.setBrush(Qt.BrushStyle.NoBrush)
        painter.drawEllipse(self.rect().center(),self.height()/2-20,self.height()/2-20)

        painter.setFont(QFont("楷体",30))
        painter.drawText(self.rect(),Qt.AlignmentFlag.AlignCenter,f"{self._curval}%")






if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = DynamicWaterRipple()
    win.show()
    sys.exit(app.exec())








  • 12
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值