Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
Indicator * indicator = new Indicator(this);
WaterTank * tank = new WaterTank(this);
connect(tank,&WaterTank::normal,indicator,&Indicator::activateNormal);
connect(tank,&WaterTank::warning,indicator,&Indicator::activateWarning);
connect(tank,&WaterTank::danger,indicator,&Indicator::activateDanger);
ui->horizontalLayout->addWidget(tank);
ui->horizontalLayout->addWidget(indicator);
}
#ifndef WATERTANK_H
#define WATERTANK_H
#include <QWidget>
#include <QTimer>
class WaterTank : public QWidget
{
Q_OBJECT
public:
explicit WaterTank(QWidget *parent = nullptr);
signals:
void normal();//Green
void warning();//Yellow
void danger();//Red
public slots:
// QWidget interface
protected:
void paintEvent(QPaintEvent *event) override;
QSize sizeHint() const override;
void wheelEvent(QWheelEvent *event) override;
private:
int waterHeight;//Coming from the sensor on the tank
QTimer * timer;
};
#endif // WATERTANK_H
#include "watertank.h"
#include <QPainter>
#include <QWheelEvent>
WaterTank::WaterTank(QWidget *parent) : QWidget(parent),
waterHeight(50),timer(new QTimer(this))
{
setSizePolicy(QSizePolicy(QSizePolicy::Preferred,QSizePolicy::Preferred));
timer->setInterval(1000);
connect(timer,&QTimer::timeout,[=](){
waterHeight += 15;
update();
//Emit signals
if(waterHeight <=210){
emit normal();
}else if ((waterHeight>=211) &&(waterHeight<=239)){
emit warning();
}else{
emit danger();
}
});
timer->start();
}
void WaterTank::paintEvent(QPaintEvent *event)
{
//Set up painter
QPen mPen;
mPen.setColor(Qt::black);
mPen.setWidth(3);
QPainter painter( this );
painter.setPen( mPen);
//Draw the tank
painter.drawLine(10,10,10,300);//Left
painter.drawLine(10,300,300,300);//Bottom
painter.drawLine(300,300,300,10);//Right
//Draw the water
painter.setBrush(Qt::blue);
painter.drawRect(10,300-waterHeight,290,waterHeight);
}
QSize WaterTank::sizeHint() const
{
return QSize(400,400);
}
void WaterTank::wheelEvent(QWheelEvent *event)
{
if(event->delta() < 0 && (waterHeight > 10)){
waterHeight -= 10;
update();
}
}
#ifndef INDICATOR_H
#define INDICATOR_H
#include <QWidget>
#include <QTimer>
class Indicator : public QWidget
{
Q_OBJECT
public:
explicit Indicator(QWidget *parent = nullptr);
signals:
public slots:
void activateNormal();//Green
void activateWarning();//Yellow
void activateDanger();//Red
// QWidget interface
protected:
void paintEvent(QPaintEvent *event) override;
// QWidget interface
public:
QSize sizeHint() const override;
private:
void toogleLights();
bool greenActive;
bool redActive;
bool yellowActive;
bool lightsOn;
QTimer * timer;
};
#endif // INDICATOR_H
#include "indicator.h"
#include <QPainter>
#include <QPen>
#include <QBrush>
Indicator::Indicator(QWidget *parent) : QWidget(parent),
greenActive(false),
redActive(false),
yellowActive(false),
lightsOn(true)
{
setSizePolicy(QSizePolicy(QSizePolicy::Preferred,QSizePolicy::Preferred));
activateNormal();
timer = new QTimer(this);
timer->setInterval(300);
connect(timer,&QTimer::timeout,[=](){
toogleLights();
});
timer->start();
}
void Indicator::activateNormal()
{
greenActive = true;
yellowActive = redActive = false;
}
void Indicator::activateWarning()
{
yellowActive = true;
redActive = greenActive = false;
}
void Indicator::activateDanger()
{
redActive = true;
yellowActive = greenActive = false;
}
void Indicator::paintEvent(QPaintEvent *event)
{
QPen mPen;
mPen.setWidth(3);
mPen.setColor(Qt::black);
QPainter painter(this);
painter.setPen(mPen);
painter.setBrush(Qt::gray);//Filll color
painter.drawRect(QRectF(0,0,120,330));
if(redActive){
//Draw the three lights
painter.setBrush((lightsOn == true) ? Qt::red : Qt::black);
painter.drawEllipse(10,10,100,100);
painter.setBrush(Qt::black);
painter.drawEllipse(10,115,100,100);
painter.setBrush(Qt::black);
painter.drawEllipse(10,220,100,100);
}else if(greenActive){
painter.setBrush(Qt::black);
painter.drawEllipse(10,10,100,100);
painter.setBrush((lightsOn == true) ? Qt::green : Qt::black);
painter.drawEllipse(10,115,100,100);
painter.setBrush(Qt::black);
painter.drawEllipse(10,220,100,100);
}else if(yellowActive){
painter.setBrush(Qt::black);
painter.drawEllipse(10,10,100,100);
painter.setBrush(Qt::black);
painter.drawEllipse(10,115,100,100);
painter.setBrush((lightsOn == true) ? Qt::yellow : Qt::black);
painter.drawEllipse(10,220,100,100);
}
}
QSize Indicator::sizeHint() const
{
return QSize(120,350);
}
void Indicator::toogleLights()
{
if(!lightsOn){
lightsOn = true;
}else{
lightsOn = false;
}
update();
}