整体框架修改
This commit is contained in:
@ -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 头部已隐藏)
|
||||
# ================================================================
|
||||
|
||||
Reference in New Issue
Block a user