当前位置: 首页 > article >正文

C++ QT 自绘呼吸灯

功能

  • 使用QLabel生成一个呼吸灯的效果,用于显示某个状态的变化
  • h
#ifndef CUELIGHTLABEL_H
#define CUELIGHTLABEL_H

#include <QLabel>
#include <QPropertyAnimation>

class CueLightLabel : public QLabel
{
    Q_OBJECT
    Q_PROPERTY(QColor color READ getColor WRITE setColor)

public:
    enum CueLightStatus
    {
        Online = 0, // 在线
        Offline,    // 离线
        Dropped,    // 掉线
        Warning,    // 报警
        Grayedg,    // 置灰
    };

    explicit CueLightLabel(QWidget *parent = nullptr);
    ~CueLightLabel();
    /// @brief 设置通信状态
    void setCommunicationStatus(bool status);
    /// @brief 设置状态
    void setStatus(CueLightStatus status);

    /// @brief 设置闪烁效果
    /// @param enabled
    void setBreathingEffectEnabled(bool enabled);

    QColor getColor() const { return m_color; }
    void setColor(QColor color) { m_color = color; }

protected:
    void paintEvent(QPaintEvent *event) override;

private:
    CueLightStatus mCurrentStatus;
    QPropertyAnimation *mAnimation = nullptr;
    QColor m_color;
};

#endif

  • cpp
#include "cuelightlabel.h"
#include <QPainter>
#include <QPen>
#include <QBrush>
#include <QToolTip>
#include <QObject>

CueLightLabel::CueLightLabel(QWidget *parent) : QLabel(parent), mCurrentStatus(Offline)
{
    setStyleSheet("QToolTip { color: #ffffff; background-color: #081640; }");
}

CueLightLabel::~CueLightLabel()
{
    delete mAnimation;
}

void CueLightLabel::setCommunicationStatus(bool status)
{
    if (status)
    {
        setStatus(CueLightLabel::Offline);
        setBreathingEffectEnabled(true);
        setToolTip("通信失败");
    }
    else
    {
        setStatus(CueLightLabel::Online);
        setBreathingEffectEnabled(false);
        setToolTip("通信成功");
    }
}

void CueLightLabel::setStatus(CueLightStatus status)
{
    if (mCurrentStatus != status)
    {
        mCurrentStatus = status;
        update();
    }
}

void CueLightLabel::setBreathingEffectEnabled(bool enabled)
{
    if (enabled)
    {
        if (!mAnimation)
        {
            mAnimation = new QPropertyAnimation(this, "color");
            mAnimation->setDuration(1000);
            mAnimation->setStartValue(QColor(Qt::transparent));
            mAnimation->setEndValue(QColor(Qt::black));
            mAnimation->setLoopCount(-1);
            mAnimation->setEasingCurve(QEasingCurve::InOutSine);
            connect(mAnimation, &QPropertyAnimation::valueChanged, this, QOverload<>::of(&QLabel::update));
        }
        mAnimation->start();
    }
    else
    {
        if (mAnimation)
        {
            mAnimation->stop();
        }
    }
}

void CueLightLabel::paintEvent(QPaintEvent *event)
{
    QLabel::paintEvent(event);

    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);

    QColor baseColor;
    switch (mCurrentStatus)
    {
    case Online:
        baseColor = Qt::green;
        break;
    case Offline:
        baseColor = Qt::red;
        break;
    case Dropped:
        baseColor = Qt::gray;
        break;
    case Warning:
        baseColor = Qt::yellow;
        break;
    case Grayedg:
        baseColor = Qt::white;
        break;
    }

    QColor color = baseColor;
    if (mAnimation && mAnimation->state() == QAbstractAnimation::Running)
    {
        QColor fadeColor = qvariant_cast<QColor>(mAnimation->currentValue());
        color.setAlpha(fadeColor.alpha());
    }

    painter.setPen(Qt::NoPen);
    painter.setBrush(color);

    int side = qMin(width(), height()) / 2;
    QRect circleRect((width() - side) / 2, (height() - side) / 2, side, side);

    painter.drawEllipse(circleRect);
}


http://www.kler.cn/a/507057.html

相关文章:

  • Windows图形界面(GUI)-QT-C/C++ - QT 对话窗口
  • Kotlin 协程基础十 —— 协作、互斥锁与共享变量
  • 【算法】枚举
  • Redis延迟队列详解
  • sparkSQL练习
  • 【C语言】_字符串拷贝函数strcpy
  • SpringSecurity详解
  • Java语言的软件工程
  • Python----Python高级(面向对象:对象,类,属性,方法)
  • wireshark抓路由器上的包 抓包路由器数据
  • Vue.js组件开发-如何实现表头搜索
  • 如何在谷歌浏览器中创建自动化工作流
  • web漏洞扫描有什么作用?web漏洞扫描原理
  • React 第三方状态管理库相关 -- Jotai 篇
  • Mysql--实战篇--大数据量表的分页优化(自增长主键,子查询主键主查询全部,查询条件加索引,覆盖索引等)
  • 如何使用wireshark 解密TLS-SSL报文
  • 深度学习-84-RAG技术之Facebook AI Similarity Search工具Faiss基础应用示例
  • 【单片机开发 - STM32(H7)】启动流程、方式、烧录方式详解
  • JS Clipboard API
  • 本地部署Web-Check网站检测与分析利器并实现远程访问实时监测
  • python爬虫笔记
  • 当PHP遇上区块链:一场奇妙的技术之旅
  • 【Python】使用python 对excel文件进行加密
  • 基于SpringCloud的广告系统设计与实现(一)
  • vscode 切换文件时,修改内容时很卡,怎么解决?
  • No.33 笔记 | Docker入门:基础概念与实用指南