43 lines
1.5 KiB
C++
43 lines
1.5 KiB
C++
#ifndef LEDINDICATOR_H
|
||
#define LEDINDICATOR_H
|
||
|
||
#include <QWidget>
|
||
#include <QTimer>
|
||
|
||
// ===================== 指示灯(自绘圆形渐变 + 外发光) =====================
|
||
// 状态:灰=未运行/关闭/正常,绿=运行/开启/到位,红=故障/液位低,
|
||
// 黄=检测中;红闪/黄闪按 500ms 周期闪烁(透明度 40%↔100%)。
|
||
class LedIndicator : public QWidget
|
||
{
|
||
Q_OBJECT
|
||
public:
|
||
enum State { Off, Green, Red, RedBlink, Yellow, YellowBlink };
|
||
|
||
explicit LedIndicator(const QString& text, QWidget* parent = nullptr);
|
||
|
||
void setState(State s);
|
||
void setText(const QString& t);
|
||
void setTextPixelSize(int px) { m_textPx = px; updateGeometry(); update(); } // 文字字号
|
||
void setRadius(int r) { m_radius = r; updateGeometry(); update(); } // 圆形指示点半径
|
||
void setDotAfterText(bool after) { m_dotAfter = after; updateGeometry(); update(); } // 圆点画在文字后面
|
||
State state() const { return m_state; }
|
||
|
||
QSize sizeHint() const override; // 宽度按文字实际宽度计算,避免文字被裁
|
||
|
||
protected:
|
||
void paintEvent(QPaintEvent*) override;
|
||
|
||
private:
|
||
int textLeft() const { return m_radius * 2 + 18; } // 文字起点:圆点区 + 左侧 10px 留白
|
||
|
||
State m_state = Off;
|
||
QString m_text;
|
||
QTimer* m_blink = nullptr;
|
||
bool m_on = true;
|
||
int m_radius = 16; // 圆形指示点 32×32
|
||
int m_textPx = 24; // 文字字号
|
||
bool m_dotAfter = false; // false=圆点在文字前,true=圆点在文字后
|
||
};
|
||
|
||
#endif // LEDINDICATOR_H
|