diff --git a/src/gui/panels/visualization_panel.py b/src/gui/panels/visualization_panel.py index c26864a..2bc5d15 100644 --- a/src/gui/panels/visualization_panel.py +++ b/src/gui/panels/visualization_panel.py @@ -1125,6 +1125,19 @@ class VisualizationPanel(QWidget): dir_group.setLayout(dir_layout) left_layout.addWidget(dir_group) + # 图像目录选择(优先指向预测结果目录) + img_dir_group = QGroupBox("图像目录") + img_dir_layout = QHBoxLayout() + self.img_dir_edit = QLineEdit() + self.img_dir_edit.setPlaceholderText("预测结果目录(自动填充)…") + self.img_dir_edit.setReadOnly(True) + img_dir_browse_btn = QPushButton("浏览") + img_dir_browse_btn.clicked.connect(self.browse_img_dir) + img_dir_layout.addWidget(self.img_dir_edit, 1) + img_dir_layout.addWidget(img_dir_browse_btn) + img_dir_group.setLayout(img_dir_layout) + left_layout.addWidget(img_dir_group) + # 图像目录树 tree_group = QGroupBox("图像目录") tree_layout = QVBoxLayout() @@ -1210,6 +1223,73 @@ class VisualizationPanel(QWidget): self.work_dir_edit.setText(dir_path) self.scan_work_directory() + def browse_img_dir(self): + """手动浏览图像目录""" + dir_path = QFileDialog.getExistingDirectory(self, "选择图像目录") + if dir_path: + self.img_dir_edit.setText(dir_path) + self.image_tree.scan_directory(dir_path) + self._load_first_image_from_tree() + + def update_from_config(self, work_dir=None, pipeline=None): + """从全局配置自动推断并填入图像目录,然后自动加载目录内容。 + + 推断优先级: + 1. {work_dir}/11_12_13_predictions/Machine_Learning_Prediction(机器学习预测) + 2. {work_dir}/11_12_13_predictions/Non_Empirical_Prediction(普通回归预测) + 3. {work_dir}/11_12_13_predictions/Custom_Regression_Prediction(自定义回归预测) + 4. {work_dir}/14_visualization(可视化目录) + 5. {work_dir}(工作目录根) + """ + if work_dir: + self.work_dir = work_dir + self.work_dir_edit.setText(str(work_dir)) + elif not self.work_dir: + return + + work_path = Path(self.work_dir) + pred_dir = work_path / "11_12_13_predictions" + + # 按优先级寻找存在的目录 + candidates = [ + pred_dir / "Machine_Learning_Prediction", + pred_dir / "Non_Empirical_Prediction", + pred_dir / "Custom_Regression_Prediction", + work_path / "14_visualization", + work_path, + ] + detected_dir = None + for candidate in candidates: + if candidate.exists() and candidate.is_dir(): + detected_dir = candidate + break + + if detected_dir: + detected_str = str(detected_dir) + self.img_dir_edit.setText(detected_str) + self.image_tree.scan_directory(detected_str) + else: + # 无预测目录时扫描整个工作目录 + self.image_tree.scan_directory(self.work_dir) + + # 自动触发加载第一张图像 + self._load_first_image_from_tree() + + def _load_first_image_from_tree(self): + """从目录树中加载第一张图像到右侧查看器""" + tree = self.image_tree + if tree is None: + return + for category_item in tree.category_items.values(): + for i in range(category_item.childCount()): + child = category_item.child(i) + data = child.data(0, Qt.UserRole) + if data and data.get("type") == "image": + img_path = data.get("path") + if img_path and Path(img_path).exists(): + self.image_viewer.load_image(img_path) + return + def scan_work_directory(self): """扫描工作目录中的图像文件""" if not self.work_dir: diff --git a/src/gui/water_quality_gui.py b/src/gui/water_quality_gui.py index 8ccbee3..01c3c15 100644 --- a/src/gui/water_quality_gui.py +++ b/src/gui/water_quality_gui.py @@ -2126,6 +2126,10 @@ class WaterQualityGUI(QMainWindow): elif index == 9: self.step7_panel.update_from_config(work_dir=self.work_dir, pipeline=self.pipeline) + # 可视化分析面板切换时自动推断图像目录并加载目录树 + elif index == 14: + self.viz_panel.update_from_config(work_dir=self.work_dir, pipeline=self.pipeline) + def apply_stylesheet(self): """应用样式表 - 应用现代化设计风格""" # 应用主样式表