feat: Add water process in GUI.

This commit is contained in:
sunwen
2025-03-04 11:04:57 +08:00
parent 7c66abb72d
commit a461a4399b
18 changed files with 1233 additions and 149 deletions

View File

@@ -0,0 +1,239 @@
#include "WaveWidget.h"
#include <QPainter>
#include <QPainterPath>
#include <QTimer>
#include <qmath.h>
WaveWidget::WaveWidget(QWidget* parent)
: QWidget(parent)
, mTimer(new QTimer(this))
, mWaveDirection()
, mValue(0)
, mYOffset(0)
, mScale(0)
, mMinValue(0)
, mMaxValue(100)
, mMinRadius(0)
, mText()
, mTextVisible(false)
, mRect()
{
hide();
}
WaveWidget::~WaveWidget()
{
}
void WaveWidget::resizeEvent(QResizeEvent* aEvent)
{
mMinRadius = qMin(width(), height()) / 2;
mRect = QRect(-mMinRadius, -mMinRadius, mMinRadius * 2 - 60, mMinRadius * 2);
QWidget::resizeEvent(aEvent);
}
void WaveWidget::paintEvent(QPaintEvent* aEvent)
{
Q_UNUSED(aEvent);
mScale = (qreal)(qAbs(mValue - mMinValue)) / (qAbs(mMaxValue - mMinValue));
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing,true);
//p.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
painter.translate(width() / 2, height() / 4);
drawBackground(&painter);
drawWater(&painter);
drawText(&painter);
}
void WaveWidget::drawBackground(QPainter* painter)
{
painter->save();
QPen pen;
pen.setWidth(3);
pen.setColor(Qt::gray);
pen.setStyle(Qt::SolidLine);
painter->setPen(pen);
//painter->setPen(Qt::NoPen);
//painter->setBrush(QColor(40, 40, 40));
painter->drawPie(mRect, 180*16, 180 * 16);
painter->restore();
}
void WaveWidget::drawText(QPainter* aPainter)
{
if (mTextVisible)
{
aPainter->save();
mText = QString("%1%").arg(mScale * 100,2,'f', 1);
//设置字体大小
//QFont font = painter->font();
//font.setPixelSize(30);
//painter->setFont(font);
//设置画笔
aPainter->setPen(QPen(Qt::white, 4));
//绘制文本
// QRect r(-d->minRadius, -d->minRadius, d->minRadius * 2, d->minRadius * 2);
aPainter->drawText(mRect, Qt::AlignCenter, mText);
aPainter->restore();
}
}
void WaveWidget::drawWater(QPainter* aPainter)
{
if (mValue == mMinValue)
{
return;
}
else if (mValue >= 50)
{
aPainter->save();
//painter->setPen(Qt::NoPen);
QLinearGradient lineGrad(QPointF(0, 0), QPointF(0, mMinRadius * 2));
lineGrad.setColorAt(0,QColor(0,170,255,255));
lineGrad.setColorAt(1,QColor(0,0,0,255));
lineGrad.setSpread(QGradient::PadSpread);
aPainter->setBrush(lineGrad);
//painter->setBrush(QBrush(QColor(0,170,255, 230)));
aPainter->drawPie(mRect , 180*16, 180 * 16);
aPainter->restore();
}
else//画波浪
{
int side = qMin(width(), height());
int height = side/2 - mScale * side;
aPainter->save();
QPainterPath wavePath; //波浪区域
QPainterPath wavePath2; //波浪区域
//1.8 角速度
//4 振幅
//height y轴相对远点偏移
//d->yOffset x=0时的相位反映在坐标系上则为图像的左右移动。
//x * M_PI / 180 把x当做角度转成弧度
wavePath.moveTo(-mMinRadius, mMinRadius); //第一点坐标为0,height;
for (int x = -mMinRadius; x <= mMinRadius; x++) //x从0~w的值而改变从而得到正弦曲线
{
double waveY = 4 * qSin(0.9 * (x * M_PI / 180 + mYOffset)) + height;// waveY随着x的值改变而改变从而得到正弦曲线
wavePath.lineTo(x, waveY); //从上一个绘制点画一条线到xwaveY
}
wavePath.lineTo(mMinRadius, mMinRadius); //右下角坐标width, height移动到右下角结束点,整体形成一个闭合路径
wavePath2.moveTo(-mMinRadius, mMinRadius);//第一点坐标为0,height;
for (int x = -mMinRadius; x <= mMinRadius; x++) //x从0~w的值而改变从而得到正弦曲线
{
double waveY = 4 * qSin(0.9 * (x * M_PI / 180 + mYOffset + 2)) + height;// waveY随着x的值改变而改变从而得到正弦曲线
wavePath2.lineTo(x, waveY); //从上一个绘制点画一条线到xwaveY
}
wavePath2.lineTo(mMinRadius, mMinRadius); //右下角坐标width, height移动到右下角结束点,整体形成一个闭合路径
QPainterPath bigPath;
bigPath.addEllipse(mRect);
wavePath = bigPath.intersected(wavePath);
wavePath2 = bigPath.intersected(wavePath2);
aPainter->setPen(Qt::NoPen);
aPainter->setBrush(QBrush(QColor(100, 184, 255, 80)));
aPainter->drawPath(wavePath); //绘制路径
QLinearGradient lineGrad(QPointF(0, 0), QPointF(0, mMinRadius * 2));
lineGrad.setColorAt(0,QColor(0,170,255,255));
lineGrad.setColorAt(1,QColor(0,0,0,255));
lineGrad.setSpread(QGradient::PadSpread);
aPainter->setBrush(lineGrad);
//painter->setBrush(QBrush(QColor(0,170,255, 230)));
aPainter->drawPath(wavePath2); //绘制路径
aPainter->restore();
}
}
int WaveWidget::minimum() const
{
return mMinValue;
}
int WaveWidget::maximum() const
{
return mMaxValue;
}
int WaveWidget::value() const
{
return mValue;
}
QString WaveWidget::text() const
{
return mText;
}
void WaveWidget::setTextVisible(bool aVisible)
{
mTextVisible = aVisible;
}
bool WaveWidget::isTextVisible() const
{
return mTextVisible;
}
void WaveWidget::reset()
{
mMinValue = 0;
mMaxValue = 100;
}
void WaveWidget::setRange(int aMinimum, int aMaximum)
{
mMinValue = aMinimum;
mMaxValue = aMaximum;
mValue = aMinimum;
}
void WaveWidget::setMinimum(int aMinimum)
{
mMinValue = aMinimum;
mValue = aMinimum;
}
void WaveWidget::setMaximum(int aMaximum)
{
mMaxValue = aMaximum;
}
void WaveWidget::setValue(int aValue)
{
if (aValue != mValue)
{
mValue = aValue;
emit valueChanged(aValue);
}
}
void WaveWidget::startCharge(int aValue, WaveDirection aDirection)
{
mValue = aValue;
mWaveDirection = aDirection;
connect(mTimer, &QTimer::timeout, this, &WaveWidget::updaterWater);
mTimer->start(30);
show();
}
void WaveWidget::stopCharge()
{
disconnect(mTimer, &QTimer::timeout, this, &WaveWidget::updaterWater);
mTimer->stop();
hide();
}
void WaveWidget::updaterWater()
{
mYOffset += 0.3;//波浪偏移
mValue += mWaveDirection * 0.025;
if (mValue >= 51 || mValue <0)
{
mYOffset = 0;
//d->value=0;
disconnect(mTimer, &QTimer::timeout, this, &WaveWidget::updaterWater);
emit closeSwitch();
}
update();
}

View File

@@ -0,0 +1,64 @@
#ifndef WAVEWIDGET_H
#define WAVEWIDGET_H
#include <QWidget>
#include <QString>
enum WaveDirection
{
DownWaveDirection = -1, UpWaveDirection = 1
};
class WaveWidget : public QWidget
{
Q_OBJECT
public:
explicit WaveWidget(QWidget* aParent = nullptr);
~WaveWidget() override;
int minimum() const;
int maximum() const;
int value() const;
virtual QString text() const;
void setTextVisible(bool aVisible);
bool isTextVisible() const;
protected:
void resizeEvent(QResizeEvent* aEvent) override;
void paintEvent(QPaintEvent* aEvent) override;
void drawBackground(QPainter* aPainter);
void drawText(QPainter* aPainter);
void drawWater(QPainter* aPainter);
public slots:
void updaterWater();
void reset();
void setRange(int minimum, int maximum);
void setMinimum(int minimum);
void setMaximum(int maximum);
void setValue(int value);
void startCharge(int aValue, WaveDirection aDirection);
void stopCharge();
Q_SIGNALS:
void valueChanged(int aValue);
void closeSwitch();
private:
QTimer* mTimer;
WaveDirection mWaveDirection;
qreal mValue;
qreal mYOffset;
qreal mScale;
int mMinValue;
int mMaxValue;
int mMinRadius;
QString mText;
bool mTextVisible;
QRect mRect;
};
#endif // WAVEWIDGET_H

View File

@@ -0,0 +1,103 @@
#include "ZFlashWidget.h"
#include <QTimer>
#include <QPainter>
#include "utilities/ScanProcessSequence.h"
namespace
{
const int ANIME_RECT_HEIGHT = 350;
const int ANIME_SPEED = 10;
const int RENFER_START_POINT = 640;
const int TOP_POINT_Y = 0;
const int BOTTOM_POINT_Y = 395;
}
ZFlashWidget::ZFlashWidget(QWidget* aParent)
: QWidget(aParent)
, mTimer(new QTimer(this))
, mRenderStartPoint(RENFER_START_POINT)
, mRenderEndPoint(mRenderStartPoint+ANIME_RECT_HEIGHT)
, mRenderDirectionUp(true)
, mRenderDirectionNumber(1)
, mStopGradientEnd(1)
, mMinRadius(0)
{
//setFixedSize(WIDGET_WIDTH,WIDGET_HEIGHT);
hide();
}
void ZFlashWidget::resizeEvent(QResizeEvent* aEvent)
{
mMinRadius = qMin(width(), height()) / 2;
QWidget::resizeEvent(aEvent);
}
void ZFlashWidget::paintEvent(QPaintEvent* aEvent)
{
Q_UNUSED(aEvent);
QPainter p(this);
p.translate(width() / 2, height() / 4);
QRect rect(-mMinRadius, -mMinRadius, mMinRadius * 2 - 60, mMinRadius * 2);
p.setRenderHint(QPainter::Antialiasing,true);
QLinearGradient lineGrad(QPointF(0, mRenderStartPoint), QPointF(0, mRenderEndPoint));
lineGrad.setColorAt(0,QColor(0,0,0,255));
lineGrad.setColorAt(0.1,QColor(0,170,255,255));
lineGrad.setColorAt(mStopGradientEnd,QColor(0,0,0,255));
lineGrad.setColorAt(1,QColor(0,0,0,255));
lineGrad.setSpread(QGradient::PadSpread);
p.setBrush(lineGrad);
QPen pen;
pen.setWidth(3);
pen.setColor(Qt::gray);
pen.setStyle(Qt::SolidLine);
p.setPen(pen);
p.drawPie(rect, 180*16, 180*16);
}
void ZFlashWidget::startFlash()
{
show();
connect(mTimer,&QTimer::timeout,this, &ZFlashWidget::updateFlash);
mTimer->start(20);
}
void ZFlashWidget::stopFlash()
{
mTimer->stop();
disconnect(mTimer,&QTimer::timeout,this, &ZFlashWidget::updateFlash);
hide();
}
void ZFlashWidget::updateFlash()
{
if(mRenderEndPoint <= TOP_POINT_Y && mRenderDirectionUp)
{
mRenderDirectionUp = false;
mRenderDirectionNumber *= -1;
mRenderStartPoint = mRenderDirectionNumber * ANIME_SPEED + TOP_POINT_Y;
}
if(mRenderEndPoint >= BOTTOM_POINT_Y && !mRenderDirectionUp)
{
mRenderDirectionUp = true;
mRenderDirectionNumber *= -1;
mRenderStartPoint = BOTTOM_POINT_Y - ANIME_SPEED;
}
mRenderStartPoint -= mRenderDirectionNumber*ANIME_SPEED;
mRenderEndPoint = mRenderStartPoint + mRenderDirectionNumber*ANIME_RECT_HEIGHT;
this->update();
}
void ZFlashWidget::quit()
{
disconnect(mTimer,&QTimer::timeout,this, &ZFlashWidget::updateFlash);
mTimer->stop();
hide();
}

View File

@@ -0,0 +1,38 @@
#ifndef ZFLASHWIDGET_H
#define ZFLASHWIDGET_H
#include <QWidget>
class QTimer;
class ZFlashWidget : public QWidget
{
Q_OBJECT
public:
ZFlashWidget(QWidget* aParent);
void setBlinkPoint(int aZ);
void stopFlash();
void startFlash();
void quit();
protected:
void paintEvent(QPaintEvent* aEvent) override;
void resizeEvent(QResizeEvent* aEvent) override;
private:
void updateFlash();
void updateStopFlash();
private:
QTimer* mTimer;
int mRenderStartPoint;
int mRenderEndPoint;
bool mRenderDirectionUp;
int mRenderDirectionNumber;
double mStopGradientEnd;
int mMinRadius;
};
#endif // ZFLASHWIDGET_H