Qt:状态指示灯

9 篇文章 1 订阅

前言

emm… 懒得写描述了,直接看代码吧,或者先看看最后的效果图也行。
人比较懒,注释也没写,那凑合看好了。有问题请留言交流,看到会及时回复😄

聊聊代码

fr_light.h

#ifndef FRLIGHT_H
#define FRLIGHT_H

#include <qwidget.h>

class FrLight : public QWidget {
  Q_OBJECT

public:
  enum State {
    kDefault,
    kNormal,
    kWorking,
    kWarning,
    kMalfunction
  };

public:
  explicit FrLight(QWidget *parent = nullptr);

  void set_state(const State& state);

  void set_default_color(const QColor& default_color);
  void set_normal_color(const QColor& normal_color);
  void set_working_color(const QColor& working_color);
  void set_warning_color(const QColor& warning_color);
  void set_malfunction_color(const QColor& malfunction_color);

protected:
  void timerEvent(QTimerEvent *);
  void paintEvent(QPaintEvent *);

private:
  int _step;
  int _timer_id;

  State _state;
  \
  QColor _default_color;
  QColor _normal_color;
  QColor _working_color;
  QColor _warning_color;
  QColor _malfunction_color;

};

#endif // FRLIGHT_H

fr_light.cc

#include "fr_light.h"

#include <qpainter.h>
#include <qbrush.h>

FrLight::FrLight(QWidget *parent) :
  QWidget(parent),
  _step(60) ,
  _timer_id(0) ,
  _state(kWorking) ,
  _default_color(127, 127, 127) ,
  _normal_color(32, 255, 32) ,
  _working_color(32, 255, 32) ,
  _warning_color(255, 255, 32) ,
  _malfunction_color(255, 32, 32) {
  update();
}

void FrLight::set_state(const FrLight::State& state) {
  _state = state;
  if (kWorking == _state) {
    _timer_id = startTimer(16);
  } else {
    killTimer(_timer_id);
    _timer_id = 0;
  }
  update();
}

void FrLight::set_default_color(const QColor& default_color) {
  _default_color = default_color;
  update();
}

void FrLight::set_normal_color(const QColor& normal_color) {
  _normal_color = normal_color;
  update();
}

void FrLight::set_working_color(const QColor& working_color) {
  _working_color = working_color;
  update();
}

void FrLight::set_warning_color(const QColor& warning_color) {
  _warning_color = warning_color;
  update();
}

void FrLight::set_malfunction_color(const QColor& malfunction_color) {
  _malfunction_color = malfunction_color;
  update();
}

void FrLight::timerEvent(QTimerEvent*) {
  update();

  --_step;
  if (_step == -60) {
    _step = 60;
  }
}

void FrLight::paintEvent(QPaintEvent*) {
  int side = qMin(width(), height());

   QPainter painter(this);
   painter.setRenderHint(QPainter::Antialiasing, true);
   painter.translate(width() / 2, height() / 2);
   painter.scale(side / 100.0, side / 100.0);


   QColor start_color, mid_color, end_color;

   switch (_state) {
     case kDefault:
       start_color = _default_color;
       mid_color = _default_color;
       end_color = _default_color;
       mid_color.setAlpha(192);
       end_color.setAlpha(0);
       break;
     case kNormal:
       start_color = _normal_color;
       mid_color = _normal_color;
       end_color = _normal_color;
       mid_color.setAlpha(192);
       end_color.setAlpha(0);
       break;
     case kWorking:
       if (0 == _timer_id) {
         _timer_id = startTimer(16);
       }
       start_color = _working_color;
       mid_color = _working_color;
       end_color = _working_color;
       start_color.setAlpha(qAbs(int(_step * 4.25)));
       mid_color.setAlpha(qAbs(int(_step * 3.2)));
       end_color.setAlpha(0);
       break;
     case kWarning:
       start_color = _warning_color;
       mid_color = _warning_color;
       end_color = _warning_color;
       mid_color.setAlpha(192);
       end_color.setAlpha(0);
       break;
     case kMalfunction:
       start_color = _malfunction_color;
       mid_color = _malfunction_color;
       end_color = _malfunction_color;
       mid_color.setAlpha(192);
       end_color.setAlpha(0);
       break;
     default:
       start_color = _default_color;
       mid_color = _default_color;
       end_color = _default_color;
       mid_color.setAlpha(192);
       end_color.setAlpha(0);
       break;
   }

   QRadialGradient radial(0, 0, 50, 0, 0);    //设置圆的原点和焦点在中心,半径50
   radial.setSpread(QGradient::PadSpread);
   radial.setColorAt(0, start_color);
   radial.setColorAt(0.9, mid_color);
   radial.setColorAt(1, end_color);

   painter.setPen(Qt::transparent);
   painter.setBrush(radial);
   painter.drawEllipse(-50, -50, 100, 100);
}

效果图

在这里插入图片描述

  • 5
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值