3.6 KiB
3.6 KiB
Fix-BUG-20260410-0004
适用场景:记录某个 BUG 的修复方案、影响评估、验证结果与落地信息。
关联信息
- Fix ID:
Fix-BUG-20260410-0004 - 关联 BUG ID:
BUG-20260410-0004 - 修复目标: 让按钮 Tooltip 在鼠标移出后立即回贴并消失,不再残留在屏幕上
- 状态:已验证
- 负责人: Codex 协作修改
- 分支 / 版本: 当前工作区 / 下一版本开发中
根因分析
- 根因:
- Tooltip 由
Button在绘制末尾以内置浮层方式直接补画,不属于独立控件树节点。 - 隐藏路径里根据托管分发状态分叉处理,在托管分发阶段仅调用
invalidateBackgroundSnapshot(),只作废 Tooltip 快照,不执行回贴。 - 当本轮后续重绘只覆盖按钮本体区域时,Tooltip 占用的屏幕区域不会被擦除,因此表现为 Tooltip 留在屏幕上。
- Tooltip 由
- 触发条件:
- Tooltip 已显示
- 鼠标移出按钮区域,进入
hideTooltip()分支
- 为什么之前没发现:
- 之前更关注 Tooltip 的显示、Hover 切换和对话框遮挡链路
- “逻辑状态已隐藏,但屏幕区域无人回贴”的问题只有在当前托管重绘路径下才更稳定暴露
- 关键证据:
Button.cpp中hideTooltip()在托管分发阶段只作废快照,不回贴 Tooltip 自身区域
修复方案
- 修复思路:
- Tooltip 既然是
Button的内置浮层,就按“内置浮层”语义处理隐藏逻辑 - 隐藏时直接调用 Tooltip 现有接口回贴背景快照并作废,不再区分托管分发阶段
- Tooltip 既然是
- 关键改动:
- 简化
Button::hideTooltip()分支 - 只要
tipVisible == true,统一调用tipLabel.hide() - 保留
tipHoverTick重置逻辑
- 简化
- 涉及文件 / 类 / 函数:
Button.cppButton::hideTooltip()
- 影响的 API / 行为:
- 无公开 API 变化
- 内部行为调整为“Tooltip 隐藏时总是立即回贴其自身区域”
- 关键约束 / 不变量:
- Tooltip 继续作为
Button内置浮层存在 - 不引入新的 Tooltip 控件树托管协议
- 不扩大
Window托管重绘 coverage
- Tooltip 继续作为
- 回滚点 / 开关:
- 若后续需要回退,只需恢复
Button::hideTooltip()的旧分支逻辑
- 若后续需要回退,只需恢复
影响评估
- 影响范围:
- 启用 Tooltip 的
Button KEY == 4等包含 Tooltip 的回归场景
- 启用 Tooltip 的
- 兼容性影响:无
- 行为变化:有(Tooltip 隐藏时由“部分路径只作废快照”改为“统一立即回贴并作废”)
- 性能影响:无
- 回归风险:
- Tooltip 隐藏时会发生一次即时局部回贴
- 由于 Tooltip 本身就是按钮内置浮层,这个行为与其显示方式一致,风险相对可控
验证结果
- 验证步骤:
- 修改
Button.cpp中Button::hideTooltip()的 Tooltip 隐藏分支 - 编译
Button.cpp - 编译
z-testDome.cpp并指定KEY=4,确认 Tooltip 相关 demo 入口可正常编译
- 验证结果:
- 代码已完成修改
- 源码级编译验证通过
- 基于当前代码链路推演,Tooltip 离开按钮后会立即回贴自身区域,不再依赖按钮本体重绘覆盖 Tooltip 区域
- 回归检查:
- 未做 GUI 手动交互回归
- 需用户进一步确认实际 Tooltip 行为
- 验证证据:
Button.cpp编译通过z-testDome.cpp /DKEY=4编译通过
落地信息
- Commit: 当前工作区未提交
- PR:[可选]
- 发布版本:[可选]
- 备注:
- 本次修复未改动 Tooltip 对外接口,只调整内部隐藏路径