背景
#82-A / #89 已消除空闲 Tick 和卡片初始化的重复渲染,但新增、编辑、完成切换、删除以及提醒处置仍会调用 update_list_widget() 清空并重建整张列表。百条以内任务时,主要浪费来自未变化卡片的 QWidget 销毁、重建、图标加载、信号连接和布局。
范围
- 在主窗口维护稳定的
task_id -> QListWidgetItem / TodoItemWidget 映射。
- 将
update_list_widget() 改为差量协调:
- 添加仅创建并插入新卡片;
- 编辑、完成切换只更新目标卡片,必要时移动或移出当前筛选;
- 删除只移除目标卡片;
- 提醒完成、推迟、忽略只协调受影响任务;
- 筛选/排序仍重新计算目标顺序,但复用未变化卡片。
- 为
TodoItemWidget 增加原位更新任务数据的入口,正文、优先级、完成态和计时呈现只更新实际变化部分。
- 正常 CRUD 不调用
QListWidget.clear();映射失配等异常恢复路径可执行一次完整重建。
- 保持空列表占位、信号只连接一次、卡片/详情浮层正确释放,并尽量保持滚动锚点。
- 继续同步调用现有
save_todos(),不修改 JSON、原子保存、备份或损坏保护语义。
- 按 bugfix 规则更新版本与 anchor。
验收标准
- 添加、编辑、完成切换、删除任一任务时,
QListWidget.clear() 调用次数为 0。
- 未变化任务的
QListWidgetItem 和 TodoItemWidget 对象身份保持不变。
- 排序字段变化时只移动目标;筛选归属变化时只添加/移除目标。
- 提醒完成、推迟、忽略只更新请求中的任务。
- 从空列表添加及删除最后一项时,占位语义正确。
- 增量更新后滚动位置/可见锚点不被无条件重置。
- 信号不重复连接,删除的卡片及详情子对象进入释放流程。
- 新增确定性测试,不使用易抖动的毫秒阈值。
- 通过
python -m compileall todo_app、完整 unittest 与 git diff --check。
- PR 记录 Windows 开发版/EXE 的 CRUD 性能手工验证仍待执行。
非目标
- TaskEditDialog 生命周期与启动阶段耗时治理;
- Windows/EXE 性能采样框架;
- 列表虚拟化或数据模型迁移;
- 空闲 Tick、提醒规则、存储格式和构建流程修改。
Parent: #82
背景
#82-A / #89 已消除空闲 Tick 和卡片初始化的重复渲染,但新增、编辑、完成切换、删除以及提醒处置仍会调用
update_list_widget()清空并重建整张列表。百条以内任务时,主要浪费来自未变化卡片的 QWidget 销毁、重建、图标加载、信号连接和布局。范围
task_id -> QListWidgetItem / TodoItemWidget映射。update_list_widget()改为差量协调:TodoItemWidget增加原位更新任务数据的入口,正文、优先级、完成态和计时呈现只更新实际变化部分。QListWidget.clear();映射失配等异常恢复路径可执行一次完整重建。save_todos(),不修改 JSON、原子保存、备份或损坏保护语义。验收标准
QListWidget.clear()调用次数为 0。QListWidgetItem和TodoItemWidget对象身份保持不变。python -m compileall todo_app、完整unittest与git diff --check。非目标
Parent: #82