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时会有bugdouble 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时会有bugqDebug()<<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.81QRadialGradient 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();
}

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二、MySql库的操作

文章目录 一、库的操作&#xff08;一&#xff09;创建数据库&#xff08;二&#xff09;创建数据库案例&#xff08;三&#xff09;字符集和校验规则1、 查看系统默认字符集以及校验规则2、查看数据库支持的字符集3、查看数据库支持的字符集校验规则4、校验规则对数据库的影响…

第五次作业 运维高级 构建 LVS-DR 集群和配置nginx负载均衡

1、基于 CentOS 7 构建 LVS-DR 群集。 LVS-DR模式工作原理 首先&#xff0c;来自客户端计算机CIP的请求被发送到Director的VIP。然后Director使用相同的VIP目的IP地址将请求发送到集群节点或真实服务器。然后&#xff0c;集群某个节点将回复该数据包&#xff0c;并将该数据包…

Linux驱动——input子系统

一、input子系统基本框架 Linux内核为了两个目的&#xff1a; 简化纯输入类外设&#xff08;如&#xff1a;键盘、鼠标、游戏杆、轨迹球、触摸屏。。。等等&#xff09;的驱动开发 统一输入类外设产生的数据格式&#xff08;struct input_event&#xff09;&#xff0c;更加方…

黑马头条项目学习--Day3: 自媒体文章发布

Day3: 自媒体文章发布 Day3: 自媒体文章发布1) 素材管理-图片上传a) 前期微服务搭建b) 具体实现 2) 素材管理-图片列表a) 接口定义b) 具体实现 3) 素材管理-照片删除/收藏a) 图片删除a1) 接口定义a2) 代码实现 b) 收藏与取消b1) 接口定义b2) 代码实现 4) 文章管理-频道列表查询…

【C++】开源:gflags命令行参数解析库配置使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍gflags命令行参数解析库配置使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&…

【UE4 RTS】08-Setting up Game Clock

前言 本篇实现的效果是在游戏运行后能够记录当前的游戏时间&#xff08;年月日时分秒&#xff09;&#xff0c;并且可以通过修改变量从而改变游戏时间进行的快慢。 效果 步骤 1. 在Blueprints文件夹中新建如下两个文件夹&#xff0c;分别命名为“GameSettings”、“Player”…

递归神经网络简介

一、说明 说起递归神经网络&#xff0c;递归神经网络&#xff08;RNN&#xff09;主要包括以下几种类型&#xff1a; 简单的RNN&#xff08;Simple RNN&#xff09;&#xff1a;最基本的RNN类型&#xff0c;每个时刻的输出都与前面时刻的状态有关。 循环神经网络&#xff08;R…

软件第三方CMA、CNAS测试的目的和意义,信息化建设验收测试依据是什么?

在当今互联网时代&#xff0c;软件的第三方CMA、CNAS测试成为了软件行业的重要环节。那么&#xff0c;这个测试的目的和意义是什么呢?另外&#xff0c;信息化建设验收测试依据又是什么呢?    一、软件测试第三方CMA、CNAS测试的目的和意义 1、研究进展 随着软件行业的迅…

C++ 混合Python编程 及 Visual Studio配置

文章目录 需求配置环节明确安装的是64位Python安装目录 创建Console C ProjectCpp 调用 Python Demo 参考 需求 接手了一个C应用程序&#xff0c;解析csv和生成csv文件&#xff0c;但是如果要把多个csv文件合并成一个Excel&#xff0c;分布在不同的Sheet中&#xff0c;又想在一…

在Echarts中的tooltip上添加点击按钮

需求&#xff1a; 在Echarts的tooltips中添加点击按钮并可以鼠标悬停点击该按钮 功能实现&#xff1a; 在option中的tooltip添加enterable: true的属性&#xff0c;表示鼠标可以移入tooltip中再在formatter中添加 <button onclick"onTooltipsFun()" stylecursor:…

【Android】MVC,MVP,MVVM三种架构模式的区别

MVC 传统的代码架构模式&#xff0c;仅仅是对代码进行了分层&#xff0c;其中的C代表Controller&#xff0c;控制的意思 将代码划分为数据层&#xff0c;视图层&#xff0c;控制层&#xff0c;三层之间可以任意交互 MVP MVP是在MVC基础上改进而来的一种架构&#xff0c;其中的…

【深度学习注意力机制系列】—— CBAM注意力机制(附pytorch实现)

CBAM&#xff08;Convolutional Block Attention Module&#xff09;是一种用于增强卷积神经网络&#xff08;CNN&#xff09;性能的注意力机制模块。它由Sanghyun Woo等人在2018年的论文[1807.06521] CBAM: Convolutional Block Attention Module (arxiv.org)中提出。CBAM的主…