@@ -161,30 +161,47 @@ def _needs_onboarding() -> bool:
161161
162162 return not load_settings ().get ("onboarded" , False )
163163
164+ def _hide_overlay (self ) -> None :
165+ """临时隐藏悬浮窗(弹 QMessageBox 前调,避免遮挡)。"""
166+ if self .overlay is not None :
167+ self .overlay .hide ()
168+
169+ def _show_overlay (self ) -> None :
170+ """恢复悬浮窗显示。"""
171+ if self .overlay is not None :
172+ self .overlay .show ()
173+
164174 def _on_window_configured (self ) -> None :
165175 """设置页"设为默认窗口"后:按新窗口重连 controller/tasker 并注入各页;
166176 引导中则提示去校准并跳页。"""
167- ok = self ._reconnect ()
177+ onboarding = self ._needs_onboarding ()
178+ # 引导中不创建悬浮窗(避免遮挡后续 QMessageBox)
179+ ok = self ._reconnect (skip_overlay = onboarding )
168180 if not ok :
181+ self ._hide_overlay ()
169182 QMessageBox .warning (
170183 self ,
171184 "连接失败" ,
172185 "未找到指定窗口,请确认游戏已启动且窗口选择正确。" ,
173186 )
187+ self ._show_overlay ()
174188 return
175- if not self . _needs_onboarding () :
189+ if not onboarding :
176190 return
191+ self ._hide_overlay ()
177192 QMessageBox .information (
178193 self ,
179194 "下一步:校准" ,
180195 "窗口已设置。请到「校准」页完成费用条校准后再凹图。" ,
181196 )
197+ self ._show_overlay ()
182198 self .nav .setCurrentRow (_PAGE_CALIB )
183199
184- def _reconnect (self ) -> bool :
200+ def _reconnect (self , skip_overlay : bool = False ) -> bool :
185201 """按 settings.json 的 window_name/class 重连 controller + 重建 tasker,
186202 注入凹图页/校准页,并(若有校准)启 measure worker。返回是否连上。
187203
204+ skip_overlay=True 时不创建/显示悬浮窗(新手引导时避免遮挡对话框)。
188205 同步执行(连窗口+post_bundle 约 1-2s,短暂卡 UI 可接受)。
189206 """
190207 from maa .toolkit import Toolkit
@@ -218,7 +235,7 @@ def _reconnect(self) -> bool:
218235 self .calib_page .set_runtime (controller )
219236
220237 # 有校准则启 measure worker(供悬浮窗/打轴实时帧)
221- if self ._calibration_data is not None :
238+ if self ._calibration_data is not None and not skip_overlay :
222239 if self .overlay is None : # 首次启动 controller 为 None 时未建,此处补建
223240 self .overlay = OverlayWindow ()
224241 self .overlay .show ()
@@ -244,13 +261,15 @@ def _on_profile_saved(self, filename: str) -> None:
244261 self .editor_page .set_profile (filename )
245262 except (OSError , ValueError ):
246263 logger .exception ("校准 %s 加载失败" , filename )
264+ onboarding = self ._needs_onboarding ()
247265 if self ._controller is not None :
248- self ._reconnect () # 用新校准重启 measure worker
266+ self ._reconnect (skip_overlay = onboarding )
249267
250- if not self . _needs_onboarding () :
268+ if not onboarding :
251269 return
252270 from aao .ui .settings_page import load_settings , save_settings
253271
272+ self ._hide_overlay ()
254273 QMessageBox .information (
255274 self ,
256275 "可以凹图了" ,
@@ -479,7 +498,8 @@ def main() -> int:
479498
480499 app = QApplication (sys .argv )
481500
482- # 校准加载:目录无任何 .json → 弹窗提示先校准,UI 仍启动(measure worker 跳过)
501+ # 校准加载:无校准则 data=None,MainWindow 会跳过 measure worker/悬浮窗,
502+ # 引导流程(首次→设置页→连接→校准)自然覆盖,不需要 pre-window 弹窗。
483503 calib_dir = calibration .calibration_dir ()
484504 has_calib = any (calib_dir .glob ("*.json" ))
485505 data = None
@@ -489,17 +509,6 @@ def main() -> int:
489509 logger .info ("校准 %s:%d 档 (%s)" , profile , len (data .profiles ), data .detection_mode )
490510 except (OSError , ValueError ):
491511 logger .exception ("校准 %s 加载失败,计时功能不可用" , profile )
492- QMessageBox .warning (
493- None ,
494- "校准加载失败" ,
495- f"校准文件 { profile } 加载失败,计时/凹图功能不可用。\n 请到「校准」页重新校准。" ,
496- )
497- else :
498- QMessageBox .information (
499- None ,
500- "未校准" ,
501- "尚未进行费用条校准,计时与凹图功能不可用。\n 请到「校准」页完成校准后再使用。" ,
502- )
503512
504513 window = MainWindow (controller , tasker , data , profile , args .no_api , args .port )
505514
0 commit comments