Skip to content

StatusLED 手搓手册

source:成品答案在 widget/status-led/(做完对照)· related:自绘控件递进链第 1 环

这是「手搓手册」

不是参考手册(查完走),是 workbook(跟着搓)。每个 step 给目标 → 提示 → 检查点,成品 repo 当答案钥匙——卡住了去对照,别整段复制。

0. 你将学到

搓完这个 StatusLED,你会打通这几样 Qt 能力(每样后面都有教程深挖,这里先用起来):

  • 自定义控件骨架:继承 QWidget + 重写 paintEvent + 实现 sizeHint / minimumSizeHint
  • Q_PROPERTY 全套:READ / WRITE / NOTIFY 三件 + Q_ENUM,让属性被 Qt 元系统、动画、Designer 识别
  • QPropertyAnimation 驱动 QColor:颜色平滑过渡(核心重头,step 4)
  • QVariantAnimation 做无限循环动画:呼吸效果(step 5)
  • 多动画对象在 paintEvent 解耦合成:过渡色与呼吸因子正交并行

1. 起点

先有个能跑的空壳。新建最小 Qt Widgets 工程,main 里弹个窗:

cpp
#include <QApplication>
#include <QWidget>
int main(int argc, char* argv[]) {
    QApplication app(argc, argv);
    QWidget w;
    w.resize(100, 100);
    w.show();
    return app.exec();
}

弹出空白窗 = 环境通了,往下走。Qt 环境不熟先看 QWidget 基类

2. 任务清单

分 6 步,每步:目标 → 提示 → 检查点。卡住翻 卡住怎么办

Step目标
1画一个带高光的静态圆盘01
2Status 枚举 + 切色(先突变)01
3status 升级为 Q_PROPERTY02
4颜色丝滑过渡(QPropertyAnimation)02
5BlinkMode:OnOff + Breathing 呼吸03
6minimumSizeHint 收尾03

成品对照:widget/status-led/(按 成品导览 的「怎么读」顺序对照)。

3. 进阶挑战(可选)

搓完基础版想再深一层:

  • 消除绿→红过渡的暗褐中间色:用 qRegisterAnimationInterpolator<QColor> 注册 HSV 插值器,让颜色走色相环而非 RGB 直线。提示:色相接近时 HSV 过渡更鲜艳。
  • 状态色可配置:加 setStatusColor(Status, QColor) 让不同应用自定义配色。思考:这会跟未来的 theme-system 重叠吗?边界在哪?
  • 下一站:toggle-switch(待产)——换皮复用同一套 Q_PROPERTY + 动画骨架,但引入状态机 + 滑动动画。

基于 VitePress 构建