waterProcess.zip
大小:4.78KB
价格:13积分
下载量:0
评分:
5.0
上传者:u012959478
更新日期:2025-09-22

Qt5利用QPainter实现水波纹进度条

资源文件列表(大概)

文件名
大小
waterProcess/
-
waterProcess/main.cpp
175B
waterProcess/waterProcess.pro
533B
waterProcess/waterprocess.cpp
4.87KB
waterProcess/waterprocess.h
1.3KB
waterProcess/widget.cpp
570B
waterProcess/widget.h
404B
waterProcess/widget.ui
2.49KB

资源内容介绍

利用QPainter实现水波纹进度条。自定义一个继承自QWidget的类,并在其中重写paintEvent方法进行绘制操作。通过使用QPainter的绘制方法和一些算法,可以实现动态的水波纹效果。
#include "waterprocess.h"#include <QDebug>WaterProcess::WaterProcess(QWidget *parent) : QWidget(parent){ m_minValue = 0; m_maxValue = 100; m_value = 30; m_borderWidth = 10.0; m_waterHeight = 0.05; m_offset = 0.6; m_bgColor = QColor(120, 120, 120); m_borderColor = QColor(80, 80, 80); m_usedColor = QColor(50, 205, 50); m_textColor = QColor(255, 255, 255); //波浪 m_timer = new QTimer(this); m_timer->setInterval(100); connect(m_timer, &QTimer::timeout, this, &WaterProcess::updateWave); m_timer->start();}void WaterProcess::setUsedColor(const QColor color){ m_usedColor = color;}void WaterProcess::paintEvent(QPaintEvent *ev){ Q_UNUSED(ev) QPainter painter(this); painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing); //背景 drawBg(&painter); //进度、水波 drawProcess(&painter); //进度数字 drawValue(&painter);}void WaterProcess::drawBg(QPainter *painter){ int width = this->width(); int height = this->height(); int side = qMin(width, height) - m_borderWidth; int startX = (width - side) * 0.5; int startY = (height - side) * 0.5; painter->save(); painter->setBrush(QBrush(m_bgColor)); if (m_borderWidth == 0) { painter->setPen(Qt::NoPen); } else { QBrush brush(m_borderColor); painter->setPen(QPen(brush, m_borderWidth, Qt::SolidLine)); } painter->drawEllipse(startX, startY, side, side); painter->restore();}void WaterProcess::drawProcess(QPainter *painter){ int width = this->width(); int height = this->height(); int side = qMin(width, height) - (2 * m_borderWidth); //直径 int startX = (width - side) * 0.5; int startY = (height - side) *0.5; int endX = startX + side; int endY = startY + side; double percent = (m_value * 1.0) / (m_maxValue - m_minValue); double w = 2 * M_PI / endX; double A = endY * m_waterHeight; double k = endY * (1.0 - percent); painter->save(); painter->setPen(Qt::NoPen); painter->setBrush(m_usedColor); QPainterPath totalPath; //加入圆形路径 totalPath.addEllipse(startX, startY, side, side); //水波路径 QPainterPath water1; QPainterPath water2; water1.moveTo(startX, endY); water2.moveTo(startX, endY); m_offset += 0.6; if (m_offset > (endX / 2)) { m_offset = 0; } for(int i = startX; i < endX; i++) { //第一条波浪Y轴 double waterY1 = (double)(A * qSin(w * i + m_offset)) + k; //第二条波浪Y轴 double waterY2; waterY2 = (double)(A * qSin(w * i + m_offset + (endX / 2 * w))) + k; water1.lineTo(i, waterY1); water2.lineTo(i, waterY2); if (m_value == m_minValue) { waterY1 = endY; } if (m_value == m_maxValue) { waterY1 = startY; } } //封闭 water1.lineTo(endX, endY); water2.lineTo(endX, endY); QPainterPath path; QColor waterColor1 = m_usedColor; waterColor1.setAlpha(100); QColor waterColor2 = m_usedColor; waterColor2.setAlpha(200); //第一条波浪 path = totalPath.intersected(water1); painter->setBrush(waterColor1); painter->drawPath(path); //第二条波浪挖去后的路径 path = totalPath.intersected(water2); painter->setBrush(waterColor2); painter->drawPath(path); painter->restore();}void WaterProcess::drawValue(QPainter *painter){ painter->save(); int width = this->width(); int height = this->height(); int side = qMin(width, height) - m_borderWidth; int startX = (width - side) * 0.5; int startY = (height - side) * 0.5; int fontSize = side / 4; QFont font; font.setFamily("华文彩云"); font.setPixelSize(fontSize); font.setBold(true); painter->setFont(font); painter->setPen(Qt::white); painter->drawText(QRectF(startX, startY, side, side), Qt::AlignCenter, QString("%1%").arg(m_value)); painter->restore();}void WaterProcess::setMinValue(int value){ m_minValue = value; update();}void WaterProcess::setMaxValue(int value){ m_maxValue = value; update();}void WaterProcess::setValue(int v){ m_value = v; update();}void WaterProcess::setBorderWidth(int width){ m_borderWidth = width; update();}void WaterProcess::setWaterHeight(int height){ m_waterHeight = height; update();}void WaterProcess::start(){ if (m_timer) { m_timer->start(); }}void WaterProcess::stop(){ if (m_timer) { m_timer->stop(); }}void WaterProcess::updateWave(){ update();}

用户评论 (0)

发表评论

captcha

相关资源

【深大算法设计与分析】往年期末真题

资源中包含:①一次小测的试卷②2021算法设计与分析期末真题③2022算法设计与分析期末真题

26.51MB47积分

华为HCIE-datacom实验考试拓扑

华为HCIE-datacom实验考试拓扑设计涵盖了四个主要板块,分别为X园区-传统园区网、Y园区-云管理园区SDN、Z园区-骨干网以及Python-自动化运维。这些板块涵盖了网络通信领域的关键方面,旨在考核考生对数据通信、网络管理以及自动化运维等核心技能的掌握程度。在X园区-传统园区网板块中,考生将会面对传统网络架构下的场景模拟,需要展现在传统网络环境中搭建、管理和故障排除的能力。这部分内容主要考察考生对传统网络架构的理解和操作技能。Y园区-云管理园区SDN板块着重于云计算和软件定义网络(SDN)的结合,考察考生在云环境下网络管理、资源调度及虚拟化等方面的实践经验。这一板块体现了当前网络技术发展的趋势,考生需要展现出对新型网络架构的理解和应用能力。Z园区-骨干网板块将对考生的网络规划和优化能力进行考核,重点考察骨干网的设计与实施。在这一板块中,考生需要展现出对大规模网络架构的规划和部署能力,以确保网络的高可用性和高性能。最后,Python-自动化运维板块则关注考生的自动化运维技能,考察其在网络运维过程中应用Python编程实现自动化任务的能力。这一板块旨在培养考生具备利

219.96KB17积分

仿写前端崩坏3(纯html css js)

项目名称:崩坏3前端界面仿制项目技术栈:HTML5, CSS3 (包括Sass/Less等预处理器), JavaScript (可能使用Vue.js、React等现代前端框架简化开发)目标:创建一个静态的、视觉上接近《崩坏3》游戏登录界面、主界面或角色选择界面的网页。资源与工具HTML:用于构建页面的基本结构,包括导航栏、背景图、角色展示区、按钮等。CSS:使用CSS进行样式设计,包括但不限于背景渐变、阴影效果、动画效果、字体样式等,以模拟《崩坏3》的UI风格。推荐使用Sass或Less等CSS预处理器以提高开发效率。JavaScript(可选):用于添加一些简单的交互效果,如按钮点击响应、轮播图等。图片与资源:从官方渠道或合法途径获取《崩坏3》的相关图片资源(如角色立绘、UI元素等),或使用相似风格的图片进行替代。 开发步骤需求分析与设计:首先分析《崩坏3》的UI特点,确定要仿制的具体界面。使用设计工具绘制草图,确定布局和样式。HTML结构搭建:根据设计稿,使用HTML构建页面的基本结构。CSS样式编写:使用CSS对页面进行样式设计,实现与《崩坏3》相似

25.28MB36积分

RockEntertain视听核心源码

是一个功能丰富的媒体播放库,旨在跨平台提供高性能、灵活的视频和音频播放能力。其源代码包含了播放器核心功能的实现,如解码、渲染、缓冲控制、格式支持扩展等,以及可能包括的UI组件(如播放控制界面)的基础框架。通过访问这些源代码,开发者可以学习如何构建一个高效且可扩展的媒体播放系统,了解媒体处理中的关键技术挑战及其解决方案。此外,源代码还提供了修改和扩展功能的机会,以满足特定项目或产品的需求,比如添加新的媒体格式支持、优化播放性能、调整UI界面等。对于希望在现有视频播放器基础上进行定制或从头开始构建自己媒体播放解决方案的开发者来说,#的源代码是一个宝贵的资源,能够加速开发过程,提供坚实的技术基础和灵感来源。

72.67MB38积分