diff --git a/src/core/workspace_manager.py b/src/core/workspace_manager.py index 03edd6d..2bc5724 100644 --- a/src/core/workspace_manager.py +++ b/src/core/workspace_manager.py @@ -46,6 +46,11 @@ class WorkspaceManager: } self.step_outputs = {} + # ★ 2026-07-01:切换工作目录时清空缓存,防止旧目录的 OutputUpdated 重放 + def clear_all_outputs(self): + """清空所有缓存的步骤输出路径。工作目录切换时调用。""" + self.step_outputs.clear() + def _publish_outputs(self, step_id: str, outputs: dict): """将发现的产出发布到 EventBus。 diff --git a/src/gui/core/workspace_initializer.py b/src/gui/core/workspace_initializer.py index a5781d4..9f77867 100644 --- a/src/gui/core/workspace_initializer.py +++ b/src/gui/core/workspace_initializer.py @@ -284,6 +284,9 @@ class WorkspaceInitializer(QObject): 这些残留路径不会被自动更新。此方法遍历所有已加载面板, 清除以旧 work_dir 开头的输出路径,确保后续 auto_populate_all() 能重新填充。 + 同时清空 WorkspaceManager 的 step_outputs 缓存, + 防止旧目录的 OutputUpdated 事件在面板懒加载时被重放。 + 安全设计: - 仅清除以旧 work_dir 开头的路径(保留用户手动指定的外部路径) - 使用 os.path.normpath 归一化比较,兼容正反斜杠混用 @@ -292,6 +295,9 @@ class WorkspaceInitializer(QObject): if not norm_old: return + # ★ 清空 WorkspaceManager 缓存,斩断旧目录的 OutputUpdated 重放链 + self._workspace_manager.clear_all_outputs() + cleared_count = 0 for step_id, panel in self._panel_factory.get_loaded_panels().items(): # 遍历面板中常见的输出/路径控件