C++ QT 自绘呼吸灯

ops/2025/1/18 13:01:56/

功能

  • 使用QLabel生成一个呼吸灯的效果,用于显示某个状态的变化
  • h
#ifndef CUELIGHTLABEL_H
#define CUELIGHTLABEL_H#include <QLabel>
#include <QPropertyAnimation>class CueLightLabel : public QLabel
{Q_OBJECTQ_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 enabledvoid 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.ppmy.cn/ops/151093.html

相关文章

算法(蓝桥杯)贪心算法7——过河的最短时间问题解析

一、题目描述 在漆黑的夜里&#xff0c;N位旅行者来到了一座狭窄且没有护栏的桥边。他们只带了一只手电筒&#xff0c;且桥窄得只够让两个人同时过。如果各自单独过桥&#xff0c;N人所需的时间已知&#xff1b;若两人同时过桥&#xff0c;则所需时间是走得较慢的那个人单独行动…

【Linux】常用指令详解二

前言 介绍一些Linux常用命令&#xff0c;本文为文章【Linux】常用指令详解一的续作 1.绝对路径与相对路径 绝对路径&#xff1a;从系统根目录开始&#xff0c;可以完整描述文件或目录的路径。使用绝对路径可以准确定位到系统中的某个文件或目录。 相对路径&#xff1a;相对…

Java Python:从简单案例理解 HTTP 服务开发与调用!

使用 Java 和 Python 实现 HTTP 服务创建和调用 在现代网络应用开发中&#xff0c;创建和调用 HTTP 服务是一项基本技能。本文将详细介绍如何使用 Java 和 Python 语言实现一个简单的 HTTP 服务&#xff0c;并展示如何使用相应语言的客户端代码对其进行调用和测试。我们将实现…

消息队列实战指南:三大MQ 与 Kafka 适用场景全解析

前言&#xff1a;在当今数字化时代&#xff0c;分布式系统和大数据处理变得愈发普遍&#xff0c;消息队列作为其中的关键组件&#xff0c;承担着系统解耦、异步通信、流量削峰等重要职责。ActiveMQ、RabbitMQ、RocketMQ 和 Kafka 作为市场上极具代表性的消息队列产品&#xff0…

芝麻http/品易http/太阳http/极光http退市后,还有哪家好用推荐?

相信&#xff0c;已经有不少程序员朋友在讨论芝麻HTTP、品易HTTP、太阳HTTP和极光HTTP退市的消息。说实话&#xff0c;芝麻系HTTP代理服务商在代理IP圈子里可以说是有举足轻重的位置&#xff0c;曾经也是吸引了不少用户的青睐。2个月前它们的退市可以说让代理IP整个市场无论是用…

Java 高级工程师面试高频题:JVM+Redis+ 并发 + 算法 + 框架

前言 在过 2 个月即将进入 3 月了&#xff0c;然而面对今年的大环境而言&#xff0c;跳槽成功的难度比往年高了很多&#xff0c;很明显的感受就是&#xff1a;对于今年的 java 开发朋友跳槽面试&#xff0c;无论一面还是二面&#xff0c;都开始考验一个 Java 程序员的技术功底…

BGP联盟

一、BGP联盟简介 1、什么是BGP联盟 BGP联盟&#xff08;Confederation&#xff09;是处理AS内部的IBGP网络连接激增的另一种方法&#xff0c;它将一个AS划分为若干个子自治系统&#xff08;Sub AS&#xff09;&#xff0c;每个子AS内部建立IBGP全连接关系或者配置反射器&#…

AI编程工具使用技巧——通义灵码

活动介绍通义灵码1. 理解通义灵码的基本概念示例代码生成 2. 使用明确的描述示例代码生成 3. 巧妙使用注释示例代码生成 4. 注意迭代与反馈原始代码反馈后生成优化代码 5. 结合生成的代码进行调试示例测试代码 其他功能定期优化生成的代码合作与分享结合其他工具 总结 活动介绍…