整体框架修改
This commit is contained in:
@ -258,10 +258,15 @@ class WaterQualityGUI(QMainWindow):
|
|||||||
banner_layout.addWidget(self._banner_label)
|
banner_layout.addWidget(self._banner_label)
|
||||||
|
|
||||||
self._banner_title_label = QLabel("MegaCube-Water Quality V1.2", self._banner_label)
|
self._banner_title_label = QLabel("MegaCube-Water Quality V1.2", self._banner_label)
|
||||||
|
# 现代化字体设计:去掉老旧的衬线体,换用带字间距的粗体无衬线字体,增加高级感
|
||||||
self._banner_title_label.setStyleSheet("""
|
self._banner_title_label.setStyleSheet("""
|
||||||
QLabel {
|
QLabel {
|
||||||
background: transparent; color: white; font-size: 48px;
|
background: transparent;
|
||||||
font-family: "Times New Roman", "Georgia", serif;
|
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)
|
self._banner_title_label.setAttribute(Qt.WA_TransparentForMouseEvents)
|
||||||
@ -299,16 +304,21 @@ class WaterQualityGUI(QMainWindow):
|
|||||||
|
|
||||||
# 上一步 / 下一步 导航按钮
|
# 上一步 / 下一步 导航按钮
|
||||||
nav_btn_layout = QHBoxLayout()
|
nav_btn_layout = QHBoxLayout()
|
||||||
nav_btn_layout.setSpacing(10)
|
nav_btn_layout.setSpacing(12)
|
||||||
self._prev_btn = QPushButton("< 上一步")
|
|
||||||
self._prev_btn.setMinimumHeight(32)
|
self._prev_btn = QPushButton(" 上一步 ")
|
||||||
self._prev_btn.setStyleSheet(ModernStylesheet.get_button_stylesheet('default'))
|
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)
|
self._prev_btn.clicked.connect(self._on_prev_clicked)
|
||||||
nav_btn_layout.addWidget(self._prev_btn)
|
nav_btn_layout.addWidget(self._prev_btn)
|
||||||
|
|
||||||
self._next_btn = QPushButton("下一步 >")
|
self._next_btn = QPushButton(" 下一步 ")
|
||||||
self._next_btn.setMinimumHeight(32)
|
self._next_btn.setMinimumHeight(36)
|
||||||
self._next_btn.setStyleSheet(ModernStylesheet.get_button_stylesheet('default'))
|
self._next_btn.setMinimumWidth(100)
|
||||||
|
# 下一步是主要操作,用 primary (主题蓝) 样式
|
||||||
|
self._next_btn.setStyleSheet(ModernStylesheet.get_button_stylesheet('primary'))
|
||||||
self._next_btn.clicked.connect(self._on_next_clicked)
|
self._next_btn.clicked.connect(self._on_next_clicked)
|
||||||
nav_btn_layout.addWidget(self._next_btn)
|
nav_btn_layout.addWidget(self._next_btn)
|
||||||
|
|
||||||
@ -329,68 +339,84 @@ class WaterQualityGUI(QMainWindow):
|
|||||||
|
|
||||||
nav_widget = QWidget()
|
nav_widget = QWidget()
|
||||||
nav_layout = QVBoxLayout()
|
nav_layout = QVBoxLayout()
|
||||||
nav_layout.setContentsMargins(10, 15, 10, 15)
|
nav_layout.setContentsMargins(0, 15, 0, 15) # 去掉左右边距,让列表通栏
|
||||||
nav_layout.setSpacing(10)
|
nav_layout.setSpacing(10)
|
||||||
|
|
||||||
title = QLabel("流程步骤")
|
title = QLabel("流程导航")
|
||||||
title.setFont(QFont("Arial", 13, QFont.Bold))
|
title.setFont(QFont("Microsoft YaHei", 14, QFont.Bold))
|
||||||
title.setAlignment(Qt.AlignCenter)
|
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)
|
nav_layout.addWidget(title)
|
||||||
|
|
||||||
self._step_list = QListWidget()
|
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()
|
process_stages = build_stage_groups()
|
||||||
stage_names = list(process_stages.keys())
|
stage_names = list(process_stages.keys())
|
||||||
|
|
||||||
for stage_idx, (stage_name, steps) in enumerate(process_stages.items()):
|
for stage_idx, (stage_name, steps) in enumerate(process_stages.items()):
|
||||||
|
# 分类头
|
||||||
stage_item = QListWidgetItem(stage_name)
|
stage_item = QListWidgetItem(stage_name)
|
||||||
stage_font = QFont("Arial", 11, QFont.Bold)
|
stage_font = QFont("Microsoft YaHei", 11, QFont.Bold)
|
||||||
stage_font.setBold(True)
|
|
||||||
stage_item.setFont(stage_font)
|
stage_item.setFont(stage_font)
|
||||||
stage_item.setForeground(QColor("#0078D4"))
|
stage_item.setForeground(QColor(ModernStylesheet.COLORS['primary']))
|
||||||
stage_item.setFlags(stage_item.flags() & ~Qt.ItemIsSelectable)
|
stage_item.setBackground(QColor(ModernStylesheet.COLORS['main_bg'])) # 给头加个浅灰底色区隔
|
||||||
stage_item.setFlags(stage_item.flags() & ~Qt.ItemIsEnabled)
|
stage_item.setFlags(stage_item.flags() & ~Qt.ItemIsSelectable & ~Qt.ItemIsEnabled)
|
||||||
stage_item.setData(Qt.UserRole, "stage_header")
|
stage_item.setData(Qt.UserRole, "stage_header")
|
||||||
self._step_list.addItem(stage_item)
|
self._step_list.addItem(stage_item)
|
||||||
|
|
||||||
|
# 具体步骤
|
||||||
for step_id, step_display in steps:
|
for step_id, step_display in steps:
|
||||||
item = QListWidgetItem(f" {step_display}")
|
item = QListWidgetItem(f" {step_display}") # 增加缩进
|
||||||
item.setData(Qt.UserRole, step_id)
|
item.setData(Qt.UserRole, step_id)
|
||||||
step_font = QFont("Arial", 10)
|
item.setFont(QFont("Microsoft YaHei", 10))
|
||||||
item.setFont(step_font)
|
|
||||||
item.setForeground(QColor(ModernStylesheet.COLORS.get('text_secondary', '#666666')))
|
|
||||||
self._step_list.addItem(item)
|
self._step_list.addItem(item)
|
||||||
|
|
||||||
|
# 分隔符 (不需要实体占用高度,缩小即可)
|
||||||
if stage_idx < len(stage_names) - 1:
|
if stage_idx < len(stage_names) - 1:
|
||||||
sep = QListWidgetItem("")
|
sep = QListWidgetItem("")
|
||||||
sep.setFlags(sep.flags() & ~Qt.ItemIsSelectable)
|
sep.setSizeHint(sep.sizeHint().expandedTo(Qt.QSize(0, 5)))
|
||||||
sep.setFlags(sep.flags() & ~Qt.ItemIsEnabled)
|
sep.setFlags(sep.flags() & ~Qt.ItemIsSelectable & ~Qt.ItemIsEnabled)
|
||||||
self._step_list.addItem(sep)
|
self._step_list.addItem(sep)
|
||||||
|
|
||||||
self._step_list.currentRowChanged.connect(self._on_step_list_changed)
|
self._step_list.currentRowChanged.connect(self._on_step_list_changed)
|
||||||
nav_layout.addWidget(self._step_list)
|
nav_layout.addWidget(self._step_list)
|
||||||
|
|
||||||
|
# 底部按钮区 (仅保留强制停止)
|
||||||
btn_layout = QVBoxLayout()
|
btn_layout = QVBoxLayout()
|
||||||
btn_layout.setSpacing(8)
|
btn_layout.setContentsMargins(15, 0, 15, 0)
|
||||||
|
|
||||||
self._run_all_btn = QPushButton("> 运行完整流程")
|
self._stop_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("⏹ 停止")
|
|
||||||
self._stop_btn.setEnabled(False)
|
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.setStyleSheet(ModernStylesheet.get_button_stylesheet('danger'))
|
||||||
self._stop_btn.clicked.connect(self._pipeline_executor.stop_pipeline)
|
self._stop_btn.clicked.connect(self._pipeline_executor.stop_pipeline)
|
||||||
btn_layout.addWidget(self._stop_btn)
|
btn_layout.addWidget(self._stop_btn)
|
||||||
|
|
||||||
nav_layout.addLayout(btn_layout)
|
nav_layout.addLayout(btn_layout)
|
||||||
nav_widget.setLayout(nav_layout)
|
nav_widget.setLayout(nav_layout)
|
||||||
nav_widget.setMaximumWidth(280)
|
nav_widget.setMaximumWidth(260)
|
||||||
nav_widget.setStyleSheet(
|
nav_widget.setStyleSheet(
|
||||||
f"background-color: {ModernStylesheet.COLORS['panel_bg']};"
|
f"background-color: {ModernStylesheet.COLORS['panel_bg']};"
|
||||||
f"border-right: 1px solid {ModernStylesheet.COLORS['border_light']};"
|
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)
|
self._event_bus.subscribe('WorkspaceChanged', self._on_workspace_changed)
|
||||||
|
|
||||||
def _on_pipeline_started(self, data):
|
def _on_pipeline_started(self, data):
|
||||||
self._run_all_btn.setEnabled(False)
|
|
||||||
self._stop_btn.setEnabled(True)
|
self._stop_btn.setEnabled(True)
|
||||||
self._log_manager.progress_bar.setValue(0)
|
self._log_manager.progress_bar.setValue(0)
|
||||||
|
|
||||||
def _on_pipeline_finished(self, data):
|
def _on_pipeline_finished(self, data):
|
||||||
self._run_all_btn.setEnabled(True)
|
|
||||||
self._stop_btn.setEnabled(False)
|
self._stop_btn.setEnabled(False)
|
||||||
success = data.get('success', False)
|
success = data.get('success', False)
|
||||||
message = data.get('message', '')
|
message = data.get('message', '')
|
||||||
@ -425,7 +449,6 @@ class WaterQualityGUI(QMainWindow):
|
|||||||
QMessageBox.critical(self, "失败", f"流程执行失败:\n\n{message[:200]}")
|
QMessageBox.critical(self, "失败", f"流程执行失败:\n\n{message[:200]}")
|
||||||
|
|
||||||
def _on_pipeline_stopped(self, data):
|
def _on_pipeline_stopped(self, data):
|
||||||
self._run_all_btn.setEnabled(True)
|
|
||||||
self._stop_btn.setEnabled(False)
|
self._stop_btn.setEnabled(False)
|
||||||
|
|
||||||
def _on_navigate_to_tab(self, data):
|
def _on_navigate_to_tab(self, data):
|
||||||
@ -446,14 +469,6 @@ class WaterQualityGUI(QMainWindow):
|
|||||||
except Exception:
|
except Exception:
|
||||||
pass
|
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 头部已隐藏)
|
# 导航 → Tab 单向路由(左侧 List 驱动右侧 Tab,Tab 头部已隐藏)
|
||||||
# ================================================================
|
# ================================================================
|
||||||
|
|||||||
Reference in New Issue
Block a user