feat(配置管理): 添加配置系统和设置界面

添加基于QConfig的配置管理系统,支持自动打开安装程序和应用打开方式的设置
新增设置标签页用于管理应用配置
更新安装确认对话框以支持配置选项
将版本号更新为Prerelease 1
This commit is contained in:
2025-09-27 21:53:54 +08:00
parent b75cc4d13d
commit 0e54dce62a
6 changed files with 223 additions and 57 deletions

View File

@@ -666,49 +666,38 @@ class AppDetailWindow(QMainWindow):
self.scroll_layout.addWidget(button_card)
def install_app(self):
"""安装应用"""
from qfluentwidgets import InfoBar
from PyQt5.QtWidgets import QMessageBox, QProgressDialog
from qfluentwidgets import InfoBar, MessageBox
from PyQt5.QtWidgets import QProgressDialog
from leonapp_gui import get_global_settings
# 检查是否有应用数据
if not hasattr(self, 'app_data'):
show_error_dialog("错误", "应用数据未加载,请刷新页面后重试。")
return
# 创建Sweet Alert风格的确认对话框
confirm_box = QMessageBox()
confirm_box.setWindowTitle("确认安装")
confirm_box.setIcon(QMessageBox.Question)
confirm_box.setText(f"您确定要安装{self.app_data.get('name', '未知应用')}吗?\n\n点击'确定'开始安装。")
# 创建QFluentWidgets风格的确认对话框
# 从全局设置获取默认的自动打开选项
global_settings = get_global_settings()
default_auto_open = bool(global_settings.auto_open_installer)
# 设置字体大小
font = QFont()
font.setPointSize(10)
confirm_box.setFont(font)
confirm_box = MessageBox("确认安装", f"您确定要安装{self.app_data.get('name', '未知应用')}吗?", self)
# 添加按钮
confirm_box.setStandardButtons(QMessageBox.Yes | QMessageBox.No)
confirm_box.setDefaultButton(QMessageBox.No)
# 添加自动打开复选框
from PyQt5.QtWidgets import QCheckBox
self.auto_open_checkbox = QCheckBox("下载后自动打开安装程序", confirm_box)
self.auto_open_checkbox.setChecked(default_auto_open) # 使用全局设置作为默认值
# 将复选框添加到对话框中
layout = confirm_box.layout()
layout.addWidget(self.auto_open_checkbox)
# 显示对话框
reply = confirm_box.exec_()
reply = confirm_box.exec()
if reply == QMessageBox.Yes:
# 创建Sweet Alert风格的成功提示
success_box = QMessageBox()
success_box.setWindowTitle("安装开始")
success_box.setIcon(QMessageBox.Information)
success_box.setText(f"{self.app_data.get('name', '未知应用')}安装已开始,请稍候...")
# 设置字体大小
font = QFont()
font.setPointSize(10)
success_box.setFont(font)
# 添加按钮
success_box.setStandardButtons(QMessageBox.Ok)
# 显示对话框
success_box.exec_()
# 保存用户选择
self.auto_open_installer = self.auto_open_checkbox.isChecked()
if reply == 1: # QFluentWidgets的MessageBox返回1表示确认
# 1. 首先尝试从应用数据中获取直接下载链接
download_url = self.app_data.get('direct_download_url')
@@ -798,7 +787,12 @@ class AppDetailWindow(QMainWindow):
self.progress_dialog.setMinimumDuration(0)
# 创建保存路径 - 使用代码文件夹所在的install目录
file_extension = ".exe" # 假设是Windows可执行文件
# 从下载URL中提取文件扩展名
import os
_, file_extension = os.path.splitext(download_url)
# 如果没有扩展名或者扩展名不合法,使用默认扩展名.zip
if not file_extension or len(file_extension) < 2:
file_extension = ".zip"
app_name = self.app_data.get('name', '未知应用').replace(' ', '_')
# 获取当前脚本所在目录
@@ -843,32 +837,69 @@ class AppDetailWindow(QMainWindow):
# 根据操作系统执行不同的安装操作
if platform.system() == "Windows":
try:
# 在Windows上直接运行可执行文件
subprocess.Popen([file_path], shell=True)
# 使用MessageBox显示下载完成提示
from qfluentwidgets import MessageBox
# 创建Sweet Alert风格的下载完成提示
success_box = QMessageBox()
success_box.setWindowTitle("下载完成")
success_box.setIcon(QMessageBox.Information)
success_box.setText(f"安装程序已启动,请按照向导完成安装。\n文件位置:{file_path}")
# 导入全局设置
from leonapp_gui import get_global_settings
global_settings = get_global_settings()
app_open_method = global_settings.app_open_method
# 设置字体大小
font = QFont()
font.setPointSize(10)
success_box.setFont(font)
# 根据用户选择决定是否自动打开安装程序
if hasattr(self, 'auto_open_installer') and self.auto_open_installer:
try:
# 根据配置的应用打开方式执行不同的操作
# 0: Windows直接运行应用程序, 1: 打开文件夹方式
if app_open_method == 0: # Windows直接运行应用程序
# 根据文件扩展名决定如何处理
import os
_, ext = os.path.splitext(file_path)
ext = ext.lower()
# 对于可执行文件,直接运行
if ext in [".exe", ".msi", ".bat", ".cmd"]:
subprocess.Popen([file_path], shell=True)
# 对于其他文件类型,使用系统默认程序打开
else:
os.startfile(file_path)
download_box = MessageBox("下载完成", f"安装程序已启动,请按照向导完成安装。\n文件位置:{file_path}", self)
download_box.exec()
return # 成功打开安装程序后不需要再打开文件夹
else: # 打开文件夹方式
# 打开下载文件夹并选中文件
subprocess.Popen(f'explorer /select,"{file_path}"')
download_box = MessageBox("下载完成", f"文件已下载完成,文件夹已打开。\n文件位置:{file_path}", self)
download_box.exec()
return
except Exception as e:
show_error_dialog("操作失败", f"无法执行操作: {str(e)}\n您可以手动运行文件: {file_path}")
else:
# 不自动打开,只显示下载完成信息
download_box = MessageBox("下载完成", f"文件已下载完成。\n文件位置:{file_path}", self)
download_box.exec()
# 添加按钮
success_box.setStandardButtons(QMessageBox.Ok)
# 显示对话框
success_box.exec_()
# 打开下载文件夹并选中文件
subprocess.Popen(f'explorer /select,"{file_path}"')
# 如果没有自动打开,或者自动打开失败后,根据配置决定默认行为
if app_open_method == 0: # 默认直接运行应用程序
try:
import os
_, ext = os.path.splitext(file_path)
ext = ext.lower()
if ext in [".exe", ".msi", ".bat", ".cmd"]:
subprocess.Popen([file_path], shell=True)
else:
os.startfile(file_path)
except Exception:
# 如果运行失败,回退到打开文件夹
subprocess.Popen(f'explorer /select,"{file_path}"')
else: # 默认打开文件夹
# 打开下载文件夹并选中文件
subprocess.Popen(f'explorer /select,"{file_path}"')
except Exception as e:
show_error_dialog("启动安装程序失败", f"无法启动安装程序: {str(e)}\n您可以手动运行文件: {file_path}")
show_error_dialog("操作失败", f"无法执行操作: {str(e)}\n您可以手动运行文件: {file_path}")
# 即使启动安装程序失败,也尝试打开下载文件夹
# 即使操作失败,也尝试打开下载文件夹
try:
subprocess.Popen(f'explorer /select,"{file_path}"')
except Exception as ex: