修复若干bug

This commit is contained in:
2026-04-03 22:48:27 +08:00
parent 10843a5bc5
commit 17655f2dba
16 changed files with 108 additions and 2 deletions
+80 -1
View File
@@ -6,10 +6,12 @@ from PyQt6.QtWidgets import (
QCheckBox, QGroupBox, QFormLayout, QSpinBox, QFrame
)
from PyQt6.QtCore import Qt, QSize
from PyQt6.QtWidgets import QMessageBox
from PyQt6.QtGui import QIcon, QPixmap
import qtawesome as qta
from db import database
import ui.theme as theme
import ui.dialog_style as dialog_style
class SettingsWindow(QDialog):
@@ -50,7 +52,10 @@ class SettingsWindow(QDialog):
("fa5s.window-maximize", "窗口"),
("fa5s.rocket", "启动"),
("fa5s.heart", "捐赠"),
("fa5s.eraser", "初始化"),
]
self._nav_ready = False
self._block_nav = False
for icon_name, label in pages:
try:
icon = qta.icon(icon_name, color="#888")
@@ -59,6 +64,8 @@ class SettingsWindow(QDialog):
# 防止图标名不存在导致设置页直接报错
icon = qta.icon("fa5s.rocket", color="#888")
item = QListWidgetItem(icon, label)
if label == "初始化":
item.setData(Qt.ItemDataRole.UserRole, "init")
self.nav.addItem(item)
self.nav.setCurrentRow(0)
self.nav.currentRowChanged.connect(self._on_nav)
@@ -69,6 +76,11 @@ class SettingsWindow(QDialog):
self.stack.addWidget(self._page_window())
self.stack.addWidget(self._page_startup())
self.stack.addWidget(self._page_donate())
self.stack.addWidget(self._page_initialization())
# 此时 stack 已就绪,允许导航回调正常工作
self._nav_ready = True
self._last_nav_index = self.nav.currentRow()
self.stack.setCurrentIndex(self._last_nav_index)
# 分割线
line = QFrame()
@@ -312,6 +324,29 @@ class SettingsWindow(QDialog):
self._donate_card = card
return page
def _page_initialization(self) -> QWidget:
page = QWidget()
layout = QVBoxLayout(page)
layout.setContentsMargins(24, 20, 24, 20)
layout.setSpacing(16)
layout.addWidget(self._section_title("初始化"))
desc = QLabel(
"点击左侧「初始化」页签后,将弹出确认提醒。\n"
"确认后会清空所有分组和程序(不可撤销)。"
)
desc.setWordWrap(True)
desc.setStyleSheet("color:#888; font-size:13px; line-height:1.6;")
layout.addWidget(desc)
self._init_status_lbl = QLabel("")
self._init_status_lbl.setStyleSheet("font-size:12px; color:#f90;")
layout.addWidget(self._init_status_lbl)
layout.addStretch()
return page
def _open_donate_image(self, img_path: str):
"""点击二维码后的弹窗大图查看。"""
t = theme.current()
@@ -386,7 +421,51 @@ class SettingsWindow(QDialog):
return line
def _on_nav(self, index: int):
self.stack.setCurrentIndex(index)
if self._block_nav:
return
if not getattr(self, "_nav_ready", False) or not hasattr(self, "stack"):
return
item = self.nav.item(index)
is_init_tab = bool(item and item.data(Qt.ItemDataRole.UserRole) == "init")
if not is_init_tab:
self.stack.setCurrentIndex(index)
self._last_nav_index = index
return
ret = dialog_style.question(
self,
"初始化",
"提醒请谨慎操作!!!!!\n\n"
"此操作会清空所有分组和程序,且无法撤销。是否继续?",
icon=QMessageBox.Icon.Warning,
)
if ret == QMessageBox.StandardButton.Yes:
try:
self._panel.reset_groups_and_items()
except Exception as e:
# 初始化失败也要尽量让用户知道原因
dialog_style.warning(self, "初始化失败", f"清空数据失败:{e}")
# 初始化失败则回退到上一个页签
self._block_nav = True
self.nav.setCurrentRow(self._last_nav_index)
self._block_nav = False
self.stack.setCurrentIndex(self._last_nav_index)
return
if hasattr(self, "_init_status_lbl"):
self._init_status_lbl.setText("已完成初始化(分组和程序已清空)。")
self.stack.setCurrentIndex(index)
self._last_nav_index = index
else:
# 用户取消:回退到上一个页签
self._block_nav = True
self.nav.setCurrentRow(self._last_nav_index)
self._block_nav = False
self.stack.setCurrentIndex(self._last_nav_index)
def _apply_theme(self):
t = theme.current()