99import json
1010from typing import TYPE_CHECKING , Any
1111
12- from PySide6 .QtCore import QObject , QThread , Signal
12+ from PySide6 .QtCore import QObject , Qt , QThread , Signal
1313from PySide6 .QtWidgets import (
1414 QCheckBox ,
1515 QComboBox ,
@@ -134,18 +134,57 @@ def __init__(self):
134134 super ().__init__ ()
135135 self ._worker : _ResourceWorker | None = None
136136 self ._thread : QThread | None = None
137+ self ._auto_preview_done = False
137138 self ._build_ui ()
138139 self ._load ()
139140
140141 def showEvent (self , event : QShowEvent ) -> None : # noqa: D401
141142 # 切到设置页自动刷新窗口列表 + profile 下拉(新校准的立即可见)
142143 self ._refresh_windows ()
143144 self ._load_profiles ()
145+ # 默认窗口存在时,首次进入设置页自动截一次预览;后续由用户点“刷新截图”更新
146+ if not self ._auto_preview_done and self ._selected_window () is not None :
147+ self ._auto_preview_done = True
148+ self ._preview_window ()
144149 super ().showEvent (event )
145150
146151 def _build_ui (self ) -> None :
147152 root = QVBoxLayout (self )
148153
154+ # --- 游戏窗口选择 ---
155+ win_box = QGroupBox ("游戏窗口(多个「明日方舟」窗口时需指定)" )
156+ win_layout = QHBoxLayout (win_box )
157+
158+ # 左侧:截图预览
159+ self .lbl_preview = QLabel ("未预览" )
160+ self .lbl_preview .setAlignment (Qt .AlignmentFlag .AlignCenter )
161+ self .lbl_preview .setMinimumSize (320 , 180 )
162+ self .lbl_preview .setStyleSheet ("background:#1f1f1f; color:#9aa0a6; border:1px solid #444;" )
163+ win_layout .addWidget (self .lbl_preview , 1 )
164+
165+ # 右侧:窗口列表 + 操作按钮 + 状态
166+ right = QVBoxLayout ()
167+ self .list_windows = QListWidget ()
168+ self .list_windows .setMinimumWidth (320 )
169+ self .list_windows .setMaximumHeight (140 )
170+ right .addWidget (self .list_windows )
171+
172+ win_btn_row = QHBoxLayout ()
173+ self .btn_refresh_win = QPushButton ("🔄 刷新列表" )
174+ self .btn_preview = QPushButton ("📸 刷新截图" )
175+ self .btn_save_win = QPushButton ("✓ 设为默认" )
176+ for b in (self .btn_refresh_win , self .btn_preview , self .btn_save_win ):
177+ win_btn_row .addWidget (b )
178+ win_btn_row .addStretch ()
179+ right .addLayout (win_btn_row )
180+ self .lbl_win_status = QLabel ("未选择" )
181+ self .lbl_win_status .setStyleSheet ("color: #9aa0a6;" )
182+ right .addWidget (self .lbl_win_status )
183+ right .addStretch ()
184+
185+ win_layout .addLayout (right , 2 )
186+ root .addWidget (win_box )
187+
149188 # --- 运行设置 ---
150189 run_box = QGroupBox ("运行设置" )
151190 form = QFormLayout (run_box )
@@ -170,25 +209,6 @@ def _build_ui(self) -> None:
170209 form .addRow (self .btn_save )
171210 root .addWidget (run_box )
172211
173- # --- 游戏窗口选择 ---
174- win_box = QGroupBox ("游戏窗口(多个「明日方舟」窗口时需指定)" )
175- wl = QVBoxLayout (win_box )
176- self .list_windows = QListWidget ()
177- self .list_windows .setMaximumHeight (120 )
178- wl .addWidget (self .list_windows )
179- win_btn_row = QHBoxLayout ()
180- self .btn_refresh_win = QPushButton ("🔄 刷新列表" )
181- self .btn_preview = QPushButton ("📸 预览截图" )
182- self .btn_save_win = QPushButton ("✓ 设为默认" )
183- for b in (self .btn_refresh_win , self .btn_preview , self .btn_save_win ):
184- win_btn_row .addWidget (b )
185- win_btn_row .addStretch ()
186- wl .addLayout (win_btn_row )
187- self .lbl_win_status = QLabel ("未选择" )
188- self .lbl_win_status .setStyleSheet ("color: #9aa0a6;" )
189- wl .addWidget (self .lbl_win_status )
190- root .addWidget (win_box )
191-
192212 # --- 资源 ---
193213 res_box = QGroupBox ("资源(干员名 / 地图)" )
194214 rl = QVBoxLayout (res_box )
@@ -269,14 +289,19 @@ def _refresh_windows(self) -> None:
269289 return
270290 saved = load_settings ()
271291 saved_name = saved .get ("window_name" )
272- for w in wins :
292+ saved_class = saved .get ("window_class" )
293+ saved_row = - 1
294+ for i , w in enumerate (wins ):
273295 text = f"{ w .window_name } [类: { w .class_name } ]"
274296 item = QListWidgetItem (text )
275- if w .window_name == saved_name :
297+ if w .window_name == saved_name and ( not saved_class or w . class_name == saved_class ) :
276298 # 标记当前默认
277299 item .setText ("★ " + text )
300+ saved_row = i
278301 self .list_windows .addItem (item )
279302 self ._windows .append (w )
303+ if saved_row >= 0 :
304+ self .list_windows .setCurrentRow (saved_row )
280305 self .lbl_win_status .setText (f"找到 { len (wins )} 个窗口,选中后可预览/设为默认" )
281306
282307 def _selected_window (self ):
@@ -286,7 +311,7 @@ def _selected_window(self):
286311 return self ._windows [row ]
287312
288313 def _preview_window (self ) -> None :
289- """对选中窗口截图,弹窗预览 (后台线程避免卡 UI)。"""
314+ """对选中窗口截图,并嵌入显示在游戏窗口设置区 (后台线程避免卡 UI)。"""
290315 w = self ._selected_window ()
291316 if w is None :
292317 self .lbl_win_status .setText ("请先在列表选中一个窗口" )
@@ -308,21 +333,20 @@ def _preview_window(self) -> None:
308333
309334 def _show_preview (self , qimg : QImage ) -> None :
310335 from PySide6 .QtGui import QPixmap
311- from PySide6 .QtWidgets import QDialog , QLabel , QVBoxLayout
312336
313- dlg = QDialog (self )
314- dlg .setWindowTitle ("窗口截图预览" )
315- lbl = QLabel ()
316337 pix = QPixmap .fromImage (qimg )
317- if pix .width () > 800 : # 缩放到合理大小预览
318- pix = pix .scaledToWidth (800 )
319- lbl .setPixmap (pix )
320- lay = QVBoxLayout (dlg )
321- lay .addWidget (lbl )
322- self .lbl_win_status .setText ("预览已生成,确认是对的画面后可设为默认" )
323- dlg .exec ()
338+ target_w = max (320 , self .lbl_preview .width () - 12 )
339+ if pix .width () > target_w :
340+ pix = pix .scaledToWidth (target_w , Qt .TransformationMode .SmoothTransformation )
341+ self .lbl_preview .setPixmap (pix )
342+ self .lbl_preview .setText ("" )
343+ self .lbl_win_status .setText ("预览已更新,确认是对的画面后可设为默认" )
324344
325345 def _on_preview_failed (self , msg : str ) -> None :
346+ from PySide6 .QtGui import QPixmap
347+
348+ self .lbl_preview .setPixmap (QPixmap ())
349+ self .lbl_preview .setText ("预览失败" )
326350 self .lbl_win_status .setText (f"预览失败: { msg } " )
327351
328352 def _save_window (self ) -> None :
0 commit comments