90% LVGL 新手踩大坑!分不清「父子控件」和「Python 子类」

0 阅读2分钟

上面我们说到了 LVGL 采用父子对象模型:所有 UI 元素都是 lv.obj 的子类,通过父子关系构建界面层级(屏幕 → 按钮 → 标签),这是新手最容易混淆的两个「父子 / 子类」概念。

首先要明确:LVGL 里的「父子对象模型」和 Python 类的「继承(子类)」是​完全不同维度的设计​,对应 OOP(面向对象)的两个核心关系:

image.png

所谓「生成不同控件的实例」,正是 LVGL 的 has-a 组合逻辑;而 Python 类继承是 is-a 的类型扩展逻辑 ——LVGL 并没有抛弃继承(控件类型本身是继承 lv.obj 的),​但界面组织的核心是「组合(父子实例)」​而非「继承(子类)」。

对于嵌入式​ ​GUI​ 来说,其核心需求是空间层级管理,LCD屏幕是二维平面,控件需要有空间归属和覆盖关系:

  • 标签必须 “贴” 在按钮上,按钮必须 “放在” 屏幕上;
  • 渲染时要按「父 → 子」顺序绘制(先画屏幕,再画按钮,最后画标签,标签才会覆盖按钮);
  • 隐藏 / 移动父控件时,子控件要跟着一起隐藏 / 移动(比如把按钮移到屏幕右侧,按钮上的标签也要跟着走)。

并且,控件之间的生命周期具有约束关系:销毁父控件时会自动销毁所有子控件(比如关闭窗口时,窗口里的按钮、标签一起释放),避免内存泄漏。

同时 GUI 的交互(点击、滑动、长按)需要「事件冒泡」:

  • 比如你点击按钮上的标签,事件会先传给标签,再传给按钮,最后传给屏幕;
  • 这种实例间的事件传递,只能通过父子层级实现 —— 继承是类型关系,两个 LabeledButton 实例之间没有任何关联,无法传递事件。

015fea17a61d745d55508867aadd5fde.png

5aa65b1307363a169c1eb9c2bf82310b.png