From 742bc392a5d1d614e940efbfc28e0b8e41b4ba56 Mon Sep 17 00:00:00 2001 From: DXC Date: Thu, 7 May 2026 16:49:24 +0800 Subject: [PATCH] =?UTF-8?q?=E7=95=8C=E9=9D=A2=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/icons/Mega Water 1.0.jpg | Bin 0 -> 30168 bytes .../water_quality_inversion_pipeline_GUI.py | 72 +++++++++- src/gui/panels/report_generation_panel.py | 14 +- src/gui/panels/step4_panel.py | 5 +- src/gui/panels/step5_panel.py | 9 ++ src/gui/panels/step6_5_panel.py | 45 +++++- src/gui/panels/step6_75_panel.py | 31 +++++ src/gui/panels/step6_panel.py | 80 ++++++++--- src/gui/panels/step8_5_panel.py | 62 ++++++++- src/gui/panels/step8_75_panel.py | 61 ++++++++- src/gui/panels/step8_panel.py | 57 +++++++- src/gui/panels/step9_panel.py | 96 +++++++++++-- src/gui/panels/visualization_panel.py | 15 +- src/gui/water_quality_gui.py | 129 ++++++++++++------ 14 files changed, 590 insertions(+), 86 deletions(-) create mode 100644 data/icons/Mega Water 1.0.jpg diff --git a/data/icons/Mega Water 1.0.jpg b/data/icons/Mega Water 1.0.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7f4a9bdb1fdcb3dd0ad6154029af69670595a899 GIT binary patch literal 30168 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 QWidget { + margin: 0px; + padding: 0px; + } """) self.addToolBar(Qt.TopToolBarArea, banner_toolbar) @@ -2122,10 +2144,34 @@ class WaterQualityGUI(QMainWindow): elif index == 6: self.step6_panel.update_from_config(work_dir=self.work_dir, pipeline=self.pipeline) + # Step6.5(非经验回归建模)切换时自动填充训练数据和模型目录 + elif index == 7: + self.step6_5_panel.update_from_config(work_dir=self.work_dir, pipeline=self.pipeline) + + # Step6.75(自定义回归建模)切换时自动填充训练数据和模型目录 + elif index == 8: + self.step6_75_panel.update_from_config(work_dir=self.work_dir, pipeline=self.pipeline) + # Step7(采样点布设)切换时自动填充掩膜和输出路径 elif index == 9: self.step7_panel.update_from_config(work_dir=self.work_dir, pipeline=self.pipeline) + # Step8(机器学习预测)切换时自动填充采样光谱和模型目录 + elif index == 10: + self.step8_panel.update_from_config(work_dir=self.work_dir, pipeline=self.pipeline) + + # Step8.5(非经验模型预测)切换时自动填充采样光谱和回归模型目录 + elif index == 11: + self.step8_5_panel.update_from_config(work_dir=self.work_dir, pipeline=self.pipeline) + + # Step8.75(自定义回归预测)切换时自动填充采样光谱和自定义回归模型目录 + elif index == 12: + self.step8_75_panel.update_from_config(work_dir=self.work_dir, pipeline=self.pipeline) + + # Step9(专题图生成)切换时自动填充预测结果目录 + elif index == 13: + self.step9_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) @@ -2853,36 +2899,43 @@ class WaterQualityGUI(QMainWindow): self.training_mode_action.setText("有训练数据模式" if checked else "无训练数据模式") def update_banner_image(self): - """更新横幅图片 - 完全跟随窗口等比缩放,填满可用宽度""" + """更新横幅图片 - 固定高度 + 居中裁剪(类似 CSS object-fit: cover)""" if not hasattr(self, 'banner_pixmap') or self.banner_pixmap.isNull(): return - # 获取可用宽度(考虑工具栏边距),跟随窗口实时变化 - available_width = max(200, self.width() - 60) - - # 先根据可用宽度计算目标高度(严格 5.25:1) - target_height = int(available_width / 5.25) - - # 限制最小高度 - if target_height < 38: - target_height = 38 - available_width = int(38 * 5.25) + TARGET_HEIGHT = 140 + target_width = self.width() - # 计算图片目标尺寸(保持 5.25:1 比例) - target_width = available_width - - # 设置固定尺寸,确保标签严格填满整个区域 - self.banner_label.setFixedSize(target_width, target_height) + # 手动计算 Cover 缩放比例:取宽/高各自所需比例的最大值, + # 确保缩放后图片的宽 ≥ target_width 且高 ≥ TARGET_HEIGHT + orig_w = self.banner_pixmap.width() + orig_h = self.banner_pixmap.height() + scale_factor = max(target_width / orig_w, TARGET_HEIGHT / orig_h) + new_w = int(orig_w * scale_factor) + new_h = int(orig_h * scale_factor) - # 等比缩放到目标尺寸,填满整个区域(允许轻微裁剪) scaled_pixmap = self.banner_pixmap.scaled( - target_width, - target_height, - Qt.KeepAspectRatioByExpanding, # 保持比例,填满区域,允许裁剪超出部分 + new_w, new_h, + Qt.IgnoreAspectRatio, Qt.SmoothTransformation ) - self.banner_label.setPixmap(scaled_pixmap) + # 居中裁剪,截取中间核心区域 + crop_x = (new_w - target_width) // 2 + crop_y = (new_h - TARGET_HEIGHT) // 2 + final_pixmap = scaled_pixmap.copy(crop_x, crop_y, target_width, TARGET_HEIGHT) + + self.banner_label.setFixedHeight(TARGET_HEIGHT) + self.banner_label.setFixedWidth(target_width) # 强制宽度填满容器 + self.banner_label.setPixmap(final_pixmap) + self.banner_label.setAlignment(Qt.AlignLeft | Qt.AlignVCenter) + + # 文字叠加层:绝对定位,保持垂直居中 + if hasattr(self, 'banner_title_label'): + title_x = 160 + title_y = max(0, (TARGET_HEIGHT - 60) // 2) + self.banner_title_label.move(title_x, title_y) + self.banner_title_label.resize(target_width - title_x - 20, 60) def resizeEvent(self, event): """窗口大小改变事件 - 实时更新横幅图片等比缩放"""