找回密码
 立即注册
首页 业界区 安全 90% LVGL 新手踩大坑!分不清「父子控件」和「Python 子 ...

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

昝琳怡 昨天 23:20
上面我们说到了 LVGL 采用父子对象模型:所有 UI 元素都是 lv.obj 的子类,通过父子关系构建界面层级(屏幕 → 按钮 → 标签),这是新手最容易混淆的两个「父子 / 子类」概念。
首先要明确:LVGL 里的「父子对象模型」和 Python 类的「继承(子类)」是​完全不同维度的设计​,对应 OOP(面向对象)的两个核心关系:
1.png

所谓「生成不同控件的实例」,正是 LVGL 的 has-a 组合逻辑;而 Python 类继承是 is-a 的类型扩展逻辑 ——LVGL 并没有抛弃继承(控件类型本身是继承 lv.obj 的),​但界面组织的核心是「组合(父子实例)」​而非「继承(子类)」。
对于嵌入式​ ​GUI​ 来说,其核心需求是空间层级管理,LCD屏幕是二维平面,控件需要有空间归属和覆盖关系:

  • 标签必须 “贴” 在按钮上,按钮必须 “放在” 屏幕上;
  • 渲染时要按「父 → 子」顺序绘制(先画屏幕,再画按钮,最后画标签,标签才会覆盖按钮);
  • 隐藏 / 移动父控件时,子控件要跟着一起隐藏 / 移动(比如把按钮移到屏幕右侧,按钮上的标签也要跟着走)。
并且,控件之间的生命周期具有约束关系:销毁父控件时会自动销毁所有子控件(比如关闭窗口时,窗口里的按钮、标签一起释放),避免内存泄漏。
同时 GUI 的交互(点击、滑动、长按)需要「事件冒泡」:

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

3.png


来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册