Qt_GUI_IM_3_5 - 8BitsCoding/RobotMentor GitHub Wiki

목차


Widget.h

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);


}

WaterTank.h

#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

WaterTank.cpp

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

}

Indicator.h

#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

Indicator.cpp

#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();
}
⚠️ **GitHub.com Fallback** ⚠️