diff --git a/source/IMG/BTN/Button.png b/source/IMG/BTN/Button.png new file mode 100644 index 0000000..671274c Binary files /dev/null and b/source/IMG/BTN/Button.png differ diff --git a/source/core/animations.py b/source/core/animations.py index ca690ae..286672e 100644 --- a/source/core/animations.py +++ b/source/core/animations.py @@ -33,8 +33,8 @@ class MultiStageAnimations(QObject): # 第二阶段:菜单元素 self.menu_widgets = [ {"widget": ui.menubg, "end_pos": QPoint(710, 0), "duration": 600}, - {"widget": ui.start_install_btn, "end_pos": QPoint(780, 250), "duration": 600}, - {"widget": ui.exit_btn, "end_pos": QPoint(780, 340), "duration": 600} + {"widget": ui.button_container, "end_pos": QPoint(780, 250), "duration": 600}, + {"widget": ui.exit_container, "end_pos": QPoint(780, 340), "duration": 600} ] self.animations = [] @@ -144,7 +144,7 @@ class MultiStageAnimations(QObject): anim_group.addAnimation(pos_anim) anim_group.addAnimation(opacity_anim) - if item["widget"] == self.ui.exit_btn: + if item["widget"] == self.ui.exit_container: anim_group.finished.connect(self.animation_finished.emit) anim_group.start() diff --git a/source/fonts/SmileySans-Oblique.ttf b/source/fonts/SmileySans-Oblique.ttf new file mode 100644 index 0000000..c297dc6 Binary files /dev/null and b/source/fonts/SmileySans-Oblique.ttf differ diff --git a/source/main_window.py b/source/main_window.py index 163dda0..2c2d684 100644 --- a/source/main_window.py +++ b/source/main_window.py @@ -57,10 +57,6 @@ class MainWindow(QMainWindow): self.debug_manager = DebugManager(self) self.download_manager = DownloadManager(self) - # 设置退出按钮和开始安装按钮的样式表,使其在禁用状态下不会变灰 - button_style = "QPushButton:disabled { opacity: 1.0; }" - self.ui.exit_btn.setStyleSheet(button_style) - self.ui.start_install_btn.setStyleSheet(button_style) # 检查管理员权限和进程 self.admin_privileges.request_admin_privileges() @@ -81,7 +77,7 @@ class MainWindow(QMainWindow): ) sys.exit(1) - # 连接信号 + # 连接信号 - 绑定到新按钮 self.ui.start_install_btn.clicked.connect(self.download_manager.file_dialog) self.ui.exit_btn.clicked.connect(self.shutdown_app) @@ -102,7 +98,8 @@ class MainWindow(QMainWindow): # 但仍然需要跟踪动画状态,防止用户在动画播放过程中退出 self.animation_in_progress = True - # 禁用开始安装按钮,防止在动画播放期间点击 + # 按钮容器初始是隐藏的,无需在这里禁用 + # 但确保开始安装按钮仍然处于禁用状态 self.ui.start_install_btn.setEnabled(False) self.animator.animation_finished.connect(self.on_animations_finished) @@ -425,4 +422,6 @@ class MainWindow(QMainWindow): if event: event.accept() else: - sys.exit(0) \ No newline at end of file + sys.exit(0) + + \ No newline at end of file diff --git a/source/ui/Ui_install.py b/source/ui/Ui_install.py index a7c69aa..d73a3fa 100644 --- a/source/ui/Ui_install.py +++ b/source/ui/Ui_install.py @@ -11,11 +11,17 @@ from PySide6.QtGui import (QAction, QBrush, QColor, QConicalGradient, QTransform) from PySide6.QtWidgets import (QApplication, QLabel, QMainWindow, QMenu, QMenuBar, QPushButton, QSizePolicy, QWidget) +import os + def load_base64_image(base64_str): pixmap = QPixmap() pixmap.loadFromData(base64.b64decode(base64_str)) return pixmap +def load_image_from_file(file_path): + if os.path.exists(file_path): + return QPixmap(file_path) + return QPixmap() class Ui_MainWindows(object): def setupUi(self, MainWindows): @@ -33,6 +39,13 @@ class Ui_MainWindows(object): MainWindows.setAnimated(True) MainWindows.setDocumentMode(False) MainWindows.setDockNestingEnabled(False) + + # 加载自定义字体 + font_id = QFontDatabase.addApplicationFont(os.path.join(os.path.dirname(os.path.dirname(__file__)), "fonts", "SmileySans-Oblique.ttf")) + font_family = QFontDatabase.applicationFontFamilies(font_id)[0] if font_id != -1 else "Arial" + self.custom_font = QFont(font_family, 16) # 创建字体对象,大小为16 + self.custom_font.setWeight(QFont.Weight.Medium) # 设置为中等粗细,不要太粗 + self.centralwidget = QWidget(MainWindows) self.centralwidget.setObjectName(u"centralwidget") self.centralwidget.setAutoFillBackground(True) @@ -71,36 +84,79 @@ class Ui_MainWindows(object): self.Mainbg.setGeometry(QRect(0, 0, 1031, 561)) self.Mainbg.setPixmap(load_base64_image(img_data["Mainbg"])) self.Mainbg.setScaledContents(True) - self.start_install_btn = QPushButton(self.centralwidget) + + # 使用新的按钮图片 + button_pixmap = load_image_from_file(os.path.join(os.path.dirname(os.path.dirname(__file__)), "IMG", "BTN", "Button.png")) + + # 创建文本标签布局的按钮 + # 开始安装按钮 - 基于背景图片和标签组合 + self.button_container = QWidget(self.centralwidget) + self.button_container.setObjectName(u"start_install_container") + self.button_container.setGeometry(QRect(780, 250, 191, 91)) + # 不要隐藏容器,让动画系统来控制它的可见性和位置 + + self.start_install_bg = QLabel(self.button_container) + self.start_install_bg.setObjectName(u"start_install_bg") + self.start_install_bg.setGeometry(QRect(0, 0, 191, 91)) + self.start_install_bg.setPixmap(button_pixmap) + self.start_install_bg.setScaledContents(True) + + self.start_install_text = QLabel(self.button_container) + self.start_install_text.setObjectName(u"start_install_text") + self.start_install_text.setGeometry(QRect(0, -3, 191, 91)) + self.start_install_text.setText("开始安装") + self.start_install_text.setFont(self.custom_font) + self.start_install_text.setAlignment(Qt.AlignmentFlag.AlignCenter) + self.start_install_text.setStyleSheet("color: black; letter-spacing: 1px;") + + # 点击区域透明按钮 + self.start_install_btn = QPushButton(self.button_container) self.start_install_btn.setObjectName(u"start_install_btn") - self.start_install_btn.setEnabled(True) - self.start_install_btn.setGeometry(QRect(780, 250, 191, 91)) - self.start_install_btn.setAutoFillBackground(False) - start_install_icon = QIcon() - start_install_pixmap = load_base64_image(img_data["start_install_btn"]) - if not start_install_pixmap.isNull(): - start_install_icon.addPixmap(start_install_pixmap) - self.start_install_btn.setIcon(start_install_icon) - self.start_install_btn.setIcon(start_install_icon) - self.start_install_btn.setIconSize(QSize(189, 110)) - self.start_install_btn.setCheckable(False) - self.start_install_btn.setAutoRepeat(False) - self.start_install_btn.setAutoDefault(False) + self.start_install_btn.setGeometry(QRect(0, 0, 191, 91)) + self.start_install_btn.setCursor(QCursor(Qt.CursorShape.PointingHandCursor)) # 设置鼠标悬停时为手形光标 self.start_install_btn.setFlat(True) - self.exit_btn = QPushButton(self.centralwidget) + self.start_install_btn.raise_() # 确保按钮在最上层 + self.start_install_btn.setStyleSheet(""" + QPushButton { + background-color: transparent; + border: none; + } + """) + + # 退出按钮 - 基于背景图片和标签组合 + self.exit_container = QWidget(self.centralwidget) + self.exit_container.setObjectName(u"exit_container") + self.exit_container.setGeometry(QRect(780, 340, 191, 91)) + # 不要隐藏容器,让动画系统来控制它的可见性和位置 + + self.exit_bg = QLabel(self.exit_container) + self.exit_bg.setObjectName(u"exit_bg") + self.exit_bg.setGeometry(QRect(0, 0, 191, 91)) + self.exit_bg.setPixmap(button_pixmap) + self.exit_bg.setScaledContents(True) + + self.exit_text = QLabel(self.exit_container) + self.exit_text.setObjectName(u"exit_text") + self.exit_text.setGeometry(QRect(0, -3, 191, 91)) + self.exit_text.setText("退出") + self.exit_text.setFont(self.custom_font) + self.exit_text.setAlignment(Qt.AlignmentFlag.AlignCenter) + self.exit_text.setStyleSheet("color: black; letter-spacing: 1px;") + + # 点击区域透明按钮 + self.exit_btn = QPushButton(self.exit_container) self.exit_btn.setObjectName(u"exit_btn") - self.exit_btn.setEnabled(True) - self.exit_btn.setGeometry(QRect(780, 340, 191, 91)) - self.exit_btn.setAutoFillBackground(False) - exit_icon = QIcon() - exit_pixmap = load_base64_image(img_data["exit_btn"]) - if not exit_pixmap.isNull(): - exit_icon.addPixmap(exit_pixmap) - self.exit_btn.setIcon(exit_icon) - self.exit_btn.setIcon(exit_icon) - self.exit_btn.setIconSize(QSize(189, 110)) - self.exit_btn.setCheckable(False) + self.exit_btn.setGeometry(QRect(0, 0, 191, 91)) + self.exit_btn.setCursor(QCursor(Qt.CursorShape.PointingHandCursor)) # 设置鼠标悬停时为手形光标 self.exit_btn.setFlat(True) + self.exit_btn.raise_() # 确保按钮在最上层 + self.exit_btn.setStyleSheet(""" + QPushButton { + background-color: transparent; + border: none; + } + """) + self.menubg = QLabel(self.centralwidget) self.menubg.setObjectName(u"menubg") self.menubg.setGeometry(QRect(710, 0, 321, 561)) @@ -115,8 +171,8 @@ class Ui_MainWindows(object): self.afterbg.raise_() self.Mainbg.raise_() self.menubg.raise_() - self.start_install_btn.raise_() - self.exit_btn.raise_() + self.button_container.raise_() + self.exit_container.raise_() self.menubar = QMenuBar(MainWindows) self.menubar.setObjectName(u"menubar") self.menubar.setGeometry(QRect(0, 0, 1024, 21)) @@ -146,8 +202,9 @@ class Ui_MainWindows(object): #if QT_CONFIG(accessibility) self.start_install_btn.setAccessibleDescription("") #endif // QT_CONFIG(accessibility) - self.start_install_btn.setText("") - self.exit_btn.setText("") + # 不再在这里设置文本,因为我们已经在setupUi中设置了 + # self.start_install_btn.setText("") + # self.exit_btn.setText("") self.menubg.setText("") self.menu.setTitle(QCoreApplication.translate("MainWindows", u"\u8bbe\u7f6e", None)) self.menu_2.setTitle(QCoreApplication.translate("MainWindows", u"\u5e2e\u52a9", None))