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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/73818.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第四章,向量组,1-向量组与线性组合、线性表示

第四章&#xff0c;向量组&#xff0c;1-向量组与线性组合、线性表示 向量方程向量与向量组向量向量组 线性组合与线性表示线性组合 线性表示定理定义 多表多&#xff08;单向&#xff09;定理推论 定义 等价&#xff08;多表多&#xff1a;双向&#xff09; 知识回顾 玩转线性…

NIO 非阻塞式IO

NIO Java NIO 基本介绍 Java NIO 全称 Java non-blocking IO&#xff0c;是指 JDK 提供的新 API。从 JDK1.4 开始&#xff0c;Java 提供了一系列改进的输入/输出的新特性&#xff0c;被统称为 NIO&#xff08;即 NewIO&#xff09;&#xff0c;是同步非阻塞的。NIO 相关类都被…

END-TO-END、SCALE HYPERPRIOR、Checkerboard梳理总结

8.9-8.15学习汇报 阅读《END-TO-END OPTIMIZED IMAGE COMPRESSION》、《VARIATIONAL IMAGE COMPRESSION WITH A SCALE HYPERPRIOR》、《Checkerboard Context Model for Efficient Learned Image Compression》 传统的图像或视频压缩方法通常分为多个步骤&#xff0c;包括变换…

工业以太网交换机-SCALANCE X200 环网组态

1.概述 SCALANCE X200 系列交换机自从2004年8月推入市场&#xff0c;当时交换机只能接入环网&#xff0c;不能做环网管理器。在各个工业现场得到了广泛的应用。2007年5月发布了X200系列新的硬件版本平台&#xff0c;普通交换机可以用HSR&#xff08;高速冗余&#xff09;方法做…

STM32F103C8T6开发笔记1:有线陀螺仪二自由度机械臂

经过之前几天的快速学习&#xff0c;今日尝试组装一款基于MPU6050陀螺仪控制的二自由度机械臂&#xff0c;本文对其使用器材以及基本原理进行介绍~ 组装效果图&#xff1a; 主要元器件如下&#xff1a; 器件个数15 KG以上 舵机3适合舵机的金属夹爪118650电池电源12V1云台支架2…

[保研/考研机试] KY35 最简真分数 北京大学复试上机题 C++实现

题目链接&#xff1a; 最简真分数https://www.nowcoder.com/share/jump/437195121691719749588 描述 给出n个正整数&#xff0c;任取两个数分别作为分子和分母组成最简真分数&#xff0c;编程求共有几个这样的组合。 输入描述&#xff1a; 每组包含n&#xff08;n<600&…

ElasticSearch安装与介绍

Elastic Stack简介 如果没有听说过Elastic Stack&#xff0c;那你一定听说过ELK&#xff0c;实际上ELK是三款软件的简称&#xff0c;分别是Elasticsearch、 Logstash、Kibana组成&#xff0c;在发展的过程中&#xff0c;又有新成员Beats的加入&#xff0c;所以就形成了Elastic…

企业计算机服务器中了Devos勒索病毒怎么办,勒索病毒解密

社会在发展&#xff0c;科技在进步&#xff0c;企业的生产也得到了很大改善&#xff0c;但是随着网络技术的不断发展&#xff0c;越来越多的企业遭到的网络安全威胁开始增多&#xff0c;其中较为明显的就是勒索病毒攻击。预防勒索病毒攻击成为日常生活中不可或缺的一部分工作。…

对约瑟夫问题的进一步思考

约瑟夫问题重述&#xff1a; 在计算机编程的算法中&#xff0c;类似问题又称为约瑟夫环 约瑟夫环&#xff1a;N个人围成一圈&#xff0c;从第一个开始报数&#xff0c;第M个将被杀掉&#xff0c;最后剩下一个&#xff0c;其余人都将被杀掉。 例如N6&#xff0c;M5&#xff0…

数仓建模之维度建模

维度建模四步走: 1、选择业务过程 维度建模是紧贴业务的,所以必须以业务为根基进行建模,那么选择业务过程,顾名思义就是在整个业务流程中选取我们需要建模的业务,根据运营提供的需求及日后的易扩展性等进行选择业务。比如商城,整个商城流程分为商家端,用户端,平台端,…

golang拥有wireshark数据包解析能力

golang拥有wireshark数据包解析能力 1. 功能和实现 wireshark拥有世界上最全面的协议解析能力并且还在不断更新中&#xff0c;通过调研&#xff0c;没有办法找到与wireshark同水平的解析工具。 为了使得golang语言可以拥有wireshark一样强大的协议解析能力&#xff0c;库 gowir…

Effective Java笔记(31)利用有限制通配符来提升 API 的灵活性

参数化类型是不变的&#xff08; invariant &#xff09; 。 换句话说&#xff0c;对于任何两个截然不同的类型 Typel 和 Type2 而言&#xff0c; List<Type1 &#xff1e;既不是 List<Type 2 &#xff1e; 的子类型&#xff0c;也不是它的超类型 。虽然 L ist<String…

Django-配置邮箱功能(一):使用django自带的发送邮件功能

一、获取邮箱授权码 以QQ邮箱为例子&#xff1a; 1、进入到设置&#xff0c;找到账户 2、开启POP3等服务&#xff0c;点击管理服务 3、进入管理服务&#xff0c;生成授权码 4、按照要求发送短信就可以了 5、将授权码复制保存&#xff0c;离开界面就看不到了 二、django项目中…

VMware Workstation中安装了Windows7系统但是VMware Tools选项为灰色及无法安装的解决方法

一、问题描述 当我们在使用VMware Workstation安装好了Windows7系统后;该安装好的Windows7系统并不能自动适配WMware的界面,只能在中间显示很小的一部分内容;此时我们就需要给Windows7系统安装VMware Tools工具; 问题一:WMware中的【安装VMware Tools】选项则是灰色的无法…

tomcat的多实例,动静分离(web服务基础结束)

多实例 多实例就是在一台服务器上有多个tomcat的服务&#xff08;核心是改端口&#xff09; 实验&#xff1a;多实例 安装步骤 1.安装好 jdk 2.安装 tomcat cd /opt tar zxvf apache-tomcat-9.0.16.tar.gz mkdir /usr/local/tomcat mv apache-tomcat-9.0.16 /usr/local/tomca…

Git简介

Git是一个开源的分布式版本控制系统&#xff0c;用于敏捷高效地处理任何或大或小的项目。 Git是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源代码的版本控制软件。 Git与常用的版本控制工具CVS、Subversion等不同&#xff0c;它采用了分布式版本库的方式&#x…

MySQL基本语法总结

创建数据库 create database 数据库名&#xff1b; -- 字符集要看mysql 版本&#xff0c; 5.7 Latin&#xff0c; 8.0 utf8 create database 数据库名 character set ‘utf8’&#xff1b;-- 指定数据库的字符集 create database IF NOT EXISTS 数据库名 charac…

vue-cli前端工程化——创建vue-cli工程 router版本的创建 目录结构 案例初步

目录 引出创建vue-cli前端工程vue-cli是什么自动构建创建vue-cli项目选择Vue的版本号 手动安装进行选择创建成功 手动创建router版多了一个router 运行测试bug解决 Vue项目结构main.jspackage.jsonvue.config.js Vue项目初步hello案例 总结 引出 1.vue-cli是啥&#xff0c;创建…

企业数字化转型与股利分配(2007-2021年)

参照李滟&#xff08;2023&#xff09;的做法&#xff0c;本团队对来自西南大学学报&#xff08;社会科学版&#xff09;《企业数字化转型与股利分配》一文中的基准回归部分进行复刻。 企业数字化转型已成为我国经济增长的新引擎和新动力。为探究数字化转型对企业财务决策的影…

Spring之事务管理

文章目录 前言一、事务及其参数含义1.事务的四个特性2.事务的传播行为&#xff08;propagation&#xff09;3.事务隔离性4.事务的隔离级别&#xff08;ioslation&#xff09;5.timeout&#xff08;超时&#xff09;6.readOnly&#xff08;是否只读&#xff09;7.rollbackFor&am…