feat: Add water process in GUI.
This commit is contained in:
239
src/components/WaveWidget.cpp
Normal file
239
src/components/WaveWidget.cpp
Normal 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); //从上一个绘制点画一条线到(x,waveY);
|
||||
}
|
||||
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); //从上一个绘制点画一条线到(x,waveY);
|
||||
}
|
||||
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();
|
||||
}
|
||||
64
src/components/WaveWidget.h
Normal file
64
src/components/WaveWidget.h
Normal 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
|
||||
103
src/components/ZFlashWidget.cpp
Normal file
103
src/components/ZFlashWidget.cpp
Normal 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();
|
||||
}
|
||||
|
||||
38
src/components/ZFlashWidget.h
Normal file
38
src/components/ZFlashWidget.h
Normal 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
|
||||
Reference in New Issue
Block a user