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

秀木易风
- 粉丝: 4069
最新资源
- 三位厦门大学的学生面对小学期的python大作业他们将用什么样的作品水水而过
- QT6 画家 QPainter 的源代码带注释 1300 行 本类奠定了 QT 的绘图基础
- 基于 MySQL 与 Python 的选课大作业及校招填表辅助系统
- 网站建设方案(人才网).doc
- 新建文件夹福建省莆田市基于云计算的电子政务公共平台顶层设计【阶段成果】v1.5.doc
- 行业网站建设方案.doc
- 基于JSP的酒店客房管理系统.doc
- 武汉大学分析化学课件-第26章-分析仪器测量电路、信号处理及计算机应用基础.ppt
- 基于网络环境的集体备课研究课题研究报告.docx
- 网络营销SEO精简版.pptx
- 软件委托开发流程及相关规范(211215095509).pdf
- 数控铣床加工中心编程实例PPT培训课件.ppt
- 计算机网络基础(继续教育试题及答案).docx
- 网络会计对传统会计的影响及发展【会计实务操作教程】.pptx
- 行政事业单位会计信息化建设路径.doc
- 网络营销内涵.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈


