diff --git a/src/gui/water_quality_gui_v2.py b/src/gui/water_quality_gui_v2.py index 98237f2..7c30353 100644 --- a/src/gui/water_quality_gui_v2.py +++ b/src/gui/water_quality_gui_v2.py @@ -258,10 +258,15 @@ class WaterQualityGUI(QMainWindow): banner_layout.addWidget(self._banner_label) self._banner_title_label = QLabel("MegaCube-Water Quality V1.2", self._banner_label) + # 现代化字体设计:去掉老旧的衬线体,换用带字间距的粗体无衬线字体,增加高级感 self._banner_title_label.setStyleSheet(""" QLabel { - background: transparent; color: white; font-size: 48px; - font-family: "Times New Roman", "Georgia", serif; + background: transparent; + color: #FFFFFF; + font-size: 42px; + font-weight: bold; + font-family: "Microsoft YaHei UI", "Segoe UI", sans-serif; + letter-spacing: 3px; } """) self._banner_title_label.setAttribute(Qt.WA_TransparentForMouseEvents) @@ -299,16 +304,21 @@ class WaterQualityGUI(QMainWindow): # 上一步 / 下一步 导航按钮 nav_btn_layout = QHBoxLayout() - nav_btn_layout.setSpacing(10) - self._prev_btn = QPushButton("< 上一步") - self._prev_btn.setMinimumHeight(32) - self._prev_btn.setStyleSheet(ModernStylesheet.get_button_stylesheet('default')) + nav_btn_layout.setSpacing(12) + + self._prev_btn = QPushButton(" 上一步 ") + self._prev_btn.setMinimumHeight(36) + self._prev_btn.setMinimumWidth(100) + # 上一步是次要操作,用 normal 样式 + self._prev_btn.setStyleSheet(ModernStylesheet.get_button_stylesheet('normal')) self._prev_btn.clicked.connect(self._on_prev_clicked) nav_btn_layout.addWidget(self._prev_btn) - self._next_btn = QPushButton("下一步 >") - self._next_btn.setMinimumHeight(32) - self._next_btn.setStyleSheet(ModernStylesheet.get_button_stylesheet('default')) + self._next_btn = QPushButton(" 下一步 ") + self._next_btn.setMinimumHeight(36) + self._next_btn.setMinimumWidth(100) + # 下一步是主要操作,用 primary (主题蓝) 样式 + self._next_btn.setStyleSheet(ModernStylesheet.get_button_stylesheet('primary')) self._next_btn.clicked.connect(self._on_next_clicked) nav_btn_layout.addWidget(self._next_btn) @@ -329,68 +339,84 @@ class WaterQualityGUI(QMainWindow): nav_widget = QWidget() nav_layout = QVBoxLayout() - nav_layout.setContentsMargins(10, 15, 10, 15) + nav_layout.setContentsMargins(0, 15, 0, 15) # 去掉左右边距,让列表通栏 nav_layout.setSpacing(10) - title = QLabel("流程步骤") - title.setFont(QFont("Arial", 13, QFont.Bold)) + title = QLabel("流程导航") + title.setFont(QFont("Microsoft YaHei", 14, QFont.Bold)) title.setAlignment(Qt.AlignCenter) - title.setStyleSheet(f"color: {ModernStylesheet.COLORS['text_primary']}; padding: 10px;") + title.setStyleSheet(f"color: {ModernStylesheet.COLORS['primary']}; padding: 10px;") nav_layout.addWidget(title) self._step_list = QListWidget() - self._step_list.setStyleSheet(ModernStylesheet.get_sidebar_stylesheet()) + # 注入纯净的现代侧边栏 QSS + self._step_list.setStyleSheet(f""" + QListWidget {{ + background-color: {ModernStylesheet.COLORS['panel_bg']}; + border: none; + outline: 0; /* 去掉点击时的虚线框 */ + }} + QListWidget::item {{ + padding: 12px 16px; + border-left: 4px solid transparent; + color: {ModernStylesheet.COLORS['text_primary']}; + }} + QListWidget::item:hover {{ + background-color: {ModernStylesheet.COLORS['hover']}; + }} + QListWidget::item:selected {{ + background-color: {ModernStylesheet.COLORS['selected']}; + color: {ModernStylesheet.COLORS['primary']}; + font-weight: bold; + border-left: 4px solid {ModernStylesheet.COLORS['primary']}; + }} + """) process_stages = build_stage_groups() stage_names = list(process_stages.keys()) for stage_idx, (stage_name, steps) in enumerate(process_stages.items()): + # 分类头 stage_item = QListWidgetItem(stage_name) - stage_font = QFont("Arial", 11, QFont.Bold) - stage_font.setBold(True) + stage_font = QFont("Microsoft YaHei", 11, QFont.Bold) stage_item.setFont(stage_font) - stage_item.setForeground(QColor("#0078D4")) - stage_item.setFlags(stage_item.flags() & ~Qt.ItemIsSelectable) - stage_item.setFlags(stage_item.flags() & ~Qt.ItemIsEnabled) + stage_item.setForeground(QColor(ModernStylesheet.COLORS['primary'])) + stage_item.setBackground(QColor(ModernStylesheet.COLORS['main_bg'])) # 给头加个浅灰底色区隔 + stage_item.setFlags(stage_item.flags() & ~Qt.ItemIsSelectable & ~Qt.ItemIsEnabled) stage_item.setData(Qt.UserRole, "stage_header") self._step_list.addItem(stage_item) + # 具体步骤 for step_id, step_display in steps: - item = QListWidgetItem(f" {step_display}") + item = QListWidgetItem(f" {step_display}") # 增加缩进 item.setData(Qt.UserRole, step_id) - step_font = QFont("Arial", 10) - item.setFont(step_font) - item.setForeground(QColor(ModernStylesheet.COLORS.get('text_secondary', '#666666'))) + item.setFont(QFont("Microsoft YaHei", 10)) self._step_list.addItem(item) + # 分隔符 (不需要实体占用高度,缩小即可) if stage_idx < len(stage_names) - 1: sep = QListWidgetItem("") - sep.setFlags(sep.flags() & ~Qt.ItemIsSelectable) - sep.setFlags(sep.flags() & ~Qt.ItemIsEnabled) + sep.setSizeHint(sep.sizeHint().expandedTo(Qt.QSize(0, 5))) + sep.setFlags(sep.flags() & ~Qt.ItemIsSelectable & ~Qt.ItemIsEnabled) self._step_list.addItem(sep) self._step_list.currentRowChanged.connect(self._on_step_list_changed) nav_layout.addWidget(self._step_list) + # 底部按钮区 (仅保留强制停止) btn_layout = QVBoxLayout() - btn_layout.setSpacing(8) - - self._run_all_btn = QPushButton("> 运行完整流程") - self._run_all_btn.setStyleSheet(ModernStylesheet.get_button_stylesheet('success')) - self._run_all_btn.setMinimumHeight(35) - self._run_all_btn.clicked.connect(self._on_run_all_clicked) - btn_layout.addWidget(self._run_all_btn) - - self._stop_btn = QPushButton("⏹ 停止") + btn_layout.setContentsMargins(15, 0, 15, 0) + + self._stop_btn = QPushButton("⏹ 强制停止当前任务") self._stop_btn.setEnabled(False) - self._stop_btn.setMinimumHeight(35) + self._stop_btn.setMinimumHeight(38) self._stop_btn.setStyleSheet(ModernStylesheet.get_button_stylesheet('danger')) self._stop_btn.clicked.connect(self._pipeline_executor.stop_pipeline) btn_layout.addWidget(self._stop_btn) nav_layout.addLayout(btn_layout) nav_widget.setLayout(nav_layout) - nav_widget.setMaximumWidth(280) + nav_widget.setMaximumWidth(260) nav_widget.setStyleSheet( f"background-color: {ModernStylesheet.COLORS['panel_bg']};" f"border-right: 1px solid {ModernStylesheet.COLORS['border_light']};" @@ -409,12 +435,10 @@ class WaterQualityGUI(QMainWindow): self._event_bus.subscribe('WorkspaceChanged', self._on_workspace_changed) def _on_pipeline_started(self, data): - self._run_all_btn.setEnabled(False) self._stop_btn.setEnabled(True) self._log_manager.progress_bar.setValue(0) def _on_pipeline_finished(self, data): - self._run_all_btn.setEnabled(True) self._stop_btn.setEnabled(False) success = data.get('success', False) message = data.get('message', '') @@ -425,7 +449,6 @@ class WaterQualityGUI(QMainWindow): QMessageBox.critical(self, "失败", f"流程执行失败:\n\n{message[:200]}") def _on_pipeline_stopped(self, data): - self._run_all_btn.setEnabled(True) self._stop_btn.setEnabled(False) def _on_navigate_to_tab(self, data): @@ -446,14 +469,6 @@ class WaterQualityGUI(QMainWindow): except Exception: pass - def _on_run_all_clicked(self): - print("==== 按钮确实被按下了 ====", flush=True) - try: - self._pipeline_executor.run_full_pipeline() - except Exception as e: - print(f"执行器调用崩溃: {e}") - traceback.print_exc() - # ================================================================ # 导航 → Tab 单向路由(左侧 List 驱动右侧 Tab,Tab 头部已隐藏) # ================================================================