fix: 导航状态锁防抖 + 运行按钮中间槽函数(修复乱跳与无响应双 Bug)
Bug1 导航乱跳:_on_step_list_changed 先调 get_panel 触发懒加载再 setCurrentIndex,避免 removeTab/insertTab 索引偏移导致跳页错乱。_on_tab_changed 加 _is_syncing 守卫斩断乒乓效应。Bug2 按钮无响应:新增 _on_run_all_clicked 中间槽函数替代直接连接,内含 print 探针 + try/except 兜底。
This commit is contained in:
@ -88,6 +88,8 @@ class WaterQualityGUI(QMainWindow):
|
||||
ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID(my_appid)
|
||||
super().__init__()
|
||||
|
||||
self._is_syncing = False
|
||||
|
||||
icon_path = get_resource_path("data/icons-1/uitubiao.ico")
|
||||
self.setWindowIcon(QIcon(icon_path))
|
||||
|
||||
@ -358,7 +360,7 @@ class WaterQualityGUI(QMainWindow):
|
||||
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._pipeline_executor.run_full_pipeline)
|
||||
self._run_all_btn.clicked.connect(self._on_run_all_clicked)
|
||||
btn_layout.addWidget(self._run_all_btn)
|
||||
|
||||
self._stop_btn = QPushButton("⏹ 停止")
|
||||
@ -417,11 +419,21 @@ class WaterQualityGUI(QMainWindow):
|
||||
work_dir = data.get('work_dir', '')
|
||||
self.statusBar().showMessage(f"工作目录: {work_dir}")
|
||||
|
||||
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 双向同步(纯 UI 路由)
|
||||
# ================================================================
|
||||
|
||||
def _on_step_list_changed(self, index):
|
||||
if self._is_syncing:
|
||||
return
|
||||
if index < 0:
|
||||
return
|
||||
item = self._step_list.item(index)
|
||||
@ -432,10 +444,21 @@ class WaterQualityGUI(QMainWindow):
|
||||
return
|
||||
from src.gui.core.panel_registry import get_tab_index
|
||||
tab_index = get_tab_index(item_data)
|
||||
if tab_index >= 0:
|
||||
if tab_index < 0:
|
||||
return
|
||||
self._is_syncing = True
|
||||
try:
|
||||
# ★ 先触发懒加载:get_panel 内部 _ensure_loaded 自带 blockSignals
|
||||
# 保护 removeTab/insertTab,面板实例化完成后再切 Tab,
|
||||
# 此时 _ensure_loaded 发现已加载直接返回,不再触发索引偏移
|
||||
self._panel_factory.get_panel(item_data)
|
||||
self._tab_widget.setCurrentIndex(tab_index)
|
||||
finally:
|
||||
self._is_syncing = False
|
||||
|
||||
def _on_tab_changed(self, index):
|
||||
if self._is_syncing:
|
||||
return
|
||||
if index < 0:
|
||||
return
|
||||
from src.gui.core.panel_registry import get_step_id_by_tab_index
|
||||
@ -447,7 +470,11 @@ class WaterQualityGUI(QMainWindow):
|
||||
if not item:
|
||||
continue
|
||||
if item.data(Qt.UserRole) == target_step_id:
|
||||
self._step_list.setCurrentRow(row)
|
||||
self._is_syncing = True
|
||||
try:
|
||||
self._step_list.setCurrentRow(row)
|
||||
finally:
|
||||
self._is_syncing = False
|
||||
break
|
||||
|
||||
# ================================================================
|
||||
|
||||
Reference in New Issue
Block a user