Qt画波浪球(小费力)

 画流动波浪

#ifndef WIDGET3_H
#define WIDGET3_H

#include <QWidget>
#include <QtMath>
class widget3 : public QWidget
{
    Q_OBJECT
public:
    explicit widget3(QWidget *parent = nullptr);
    void set_value(int v){
        value=v;
    }
    int get_value(){
        return value;
    }
protected:
    void paintEvent(QPaintEvent *event) override;
    void timerEvent(QTimerEvent *event) override;
signals:

private:
    double m_water_H=0.2;//振幅系数
    double m_offset=0;//偏移量
    int m_updateTime =100;//移动速度
    int value;
};

#endif // WIDGET3_H
#include "widget3.h"
#include <QPainter>
#include <QDebug>
widget3::widget3(QWidget *parent) : QWidget(parent)
{
    m_updateTime=100;
    value=30;
    this->startTimer(m_updateTime);
}

void widget3::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform | QPainter::TextAntialiasing, true);
    //y = A * qSin(ωx + φ) + k
    //0或100时会有bug
    double h1=height()*(1-(1.0*value/100));//波线的中间点

    painter.translate(0,h1);
    m_water_H=0.05;
    double A=height()*m_water_H;//振幅
    double T=width()/2;
    double w=2*M_PI/T;//W=2pi/T,T越大,w越小
    double k=0;

    QPainterPath waterPath;
    double h2=height()-h1;
    waterPath.moveTo(0,h2);
    waterPath.lineTo(0,0);

    if(m_offset == T){
        m_offset=0;
    }
    else{
        m_offset+=T/10;
    }

    for(int x=0;x<=width();x++)
    {
        double waterY=-(double)(A*sin(w*x+m_offset))+k;
        waterPath.lineTo(x,waterY);
    }
    waterPath.lineTo(width(),h2);
    painter.setPen(Qt::NoPen);
    painter.setBrush(QBrush(QColor(166, 196, 255)));
    painter.drawPath(waterPath);
}

void widget3::timerEvent(QTimerEvent *event)
{
    this->update();
}

 QRadialGradient简单使用

void widget2::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform | QPainter::TextAntialiasing, true);

    double side=fmin(width(),height());
    QRadialGradient radialGradient(width()/2, height()/2, side, width()/2, height()/2);

    radialGradient.setColorAt(0,Qt::red);
    radialGradient.setColorAt(0.5,Qt::blue);        //设置50%处的半径为蓝色
    radialGradient.setColorAt(1,Qt::green);
    painter.setBrush(radialGradient);
    painter.drawEllipse((width()-side) / 2, 0, side, side);
}

 为球中流动波浪添加渐变效果

    QRadialGradient radialGradient(width()/2,height()/2,side/2,width()/2,height()/2);

    radialGradient.setColorAt(1,QColor(102, 145, 255));
    radialGradient.setColorAt(0.90,QColor(157, 190, 255));
    radialGradient.setColorAt(0,QColor(157, 190, 255));
    painter.setBrush(radialGradient);
    painter.drawPath(path);

 为外层再套上一层渐变效果

void widget3::draw_Circle(QPainter &painter)
{
    painter.save();
    //y = A * qSin(ωx + φ) + k
    //0或100时会有bug

    qDebug()<<value;
    double h1=height()*(1-(1.0*value/100));//波线的中间点,value=30,高度为0.7*height()

    m_water_H=0.05;
    double A=height()*m_water_H;//振幅
    double T=width()/2;
    double w=2*M_PI/T;//W=2pi/T,T越大,w越小
    double k=0;

    QPainterPath waterPath;
    double h2=height()-h1;//这里就是0.3*height()
    waterPath.moveTo(0,height());
    waterPath.lineTo(0,h2);

    if(m_offset == T){
        m_offset=0;
    }
    else{
        m_offset+=T/10;
    }

    for(int x=0;x<=width();x++)
    {
        double waterY=-(double)(A*sin(w*x+m_offset))+k;
        waterPath.lineTo(x,waterY+h1);
    }
    waterPath.lineTo(width(),height());

    QPainterPath bigPath;
    double side=fmin(width(),height());
    painter.setPen(Qt::NoPen);
    painter.setBrush(QBrush(QColor(255,255,255)));
    painter.drawEllipse(width()/2-side*0.45,height()/2-side*0.45,side*0.9,side*0.9);
    bigPath.addEllipse(width()/2-side*0.45,height()/2-side*0.45,side*0.9,side*0.9);


    //新路径,用大路径减去波浪区域的路径,形成遮罩效果
    QPainterPath path;
    //圆的部分与波浪的部分结合
    path = bigPath.intersected(waterPath);
    painter.setPen(Qt::NoPen);
    //r=0.5side,r1=0.45side
    //r1*0.9=0.45side*0.9=0.5side*0.81
    QRadialGradient radialGradient1(width()/2,height()/2,side/2,width()/2,height()/2);
    radialGradient1.setColorAt(1,QColor(235, 243, 255));
    radialGradient1.setColorAt(0.81,QColor(255,255,255));
    radialGradient1.setColorAt(0,QColor(255,255,255));
    painter.setBrush(radialGradient1);
    painter.drawEllipse(width()/2-side/2,height()/2-side/2,side,side);

    QRadialGradient radialGradient(width()/2,height()/2,side*0.45,width()/2,height()/2);
    radialGradient.setColorAt(1,QColor(102, 145, 255));
    radialGradient.setColorAt(0.90,QColor(157, 190, 255));
    radialGradient.setColorAt(0,QColor(157, 190, 255));
    painter.setBrush(radialGradient);
    painter.drawPath(path);

    painter.restore();
}

 画文字

void widget3::drawText1(QPainter &painter,QString text)
{
    painter.save();
    double x_center,y_center;
    x_center=width()/2;
    y_center=height()/2;
    painter.translate(x_center,y_center);
    QFont font;
    font.setPointSize(15);
    font.setFamily("方正粗黑宋简体");
    painter.setFont(font);
    QPen pen;
    pen.setColor(QColor(0,0,0));
    painter.setPen(pen);
    painter.drawText(-100,-50,200,50,Qt::AlignCenter,text);
    painter.restore();
}

void widget3::drawText2(QPainter &painter, QString text)
{
    painter.save();
    double x_center,y_center;
    x_center=width()/2;
    y_center=height()/2;
    painter.translate(x_center,y_center);
    QFont font;
    font.setPointSize(10);
    painter.setFont(font);
    QPen pen;
    pen.setColor(QColor(97, 99, 102));
    painter.setPen(pen);
    painter.drawText(-100,0,200,50,Qt::AlignCenter,text);
    painter.restore();
}

注释:一些细节需要自己去调整参数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lpl还在学习的路上

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值