feat(core): 重构按钮显示和动画

- 更新动画逻辑,使用新的按钮容器
- 优化按钮点击区域和视觉效果
- 添加了得意黑作为字体和样式
This commit is contained in:
hyb-oyqq
2025-07-24 17:43:11 +08:00
parent dab2ba2dc5
commit 3753375bed
5 changed files with 96 additions and 40 deletions

BIN
source/IMG/BTN/Button.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

View File

@@ -33,8 +33,8 @@ class MultiStageAnimations(QObject):
# 第二阶段:菜单元素 # 第二阶段:菜单元素
self.menu_widgets = [ self.menu_widgets = [
{"widget": ui.menubg, "end_pos": QPoint(710, 0), "duration": 600}, {"widget": ui.menubg, "end_pos": QPoint(710, 0), "duration": 600},
{"widget": ui.start_install_btn, "end_pos": QPoint(780, 250), "duration": 600}, {"widget": ui.button_container, "end_pos": QPoint(780, 250), "duration": 600},
{"widget": ui.exit_btn, "end_pos": QPoint(780, 340), "duration": 600} {"widget": ui.exit_container, "end_pos": QPoint(780, 340), "duration": 600}
] ]
self.animations = [] self.animations = []
@@ -144,7 +144,7 @@ class MultiStageAnimations(QObject):
anim_group.addAnimation(pos_anim) anim_group.addAnimation(pos_anim)
anim_group.addAnimation(opacity_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.finished.connect(self.animation_finished.emit)
anim_group.start() anim_group.start()

Binary file not shown.

View File

@@ -57,10 +57,6 @@ class MainWindow(QMainWindow):
self.debug_manager = DebugManager(self) self.debug_manager = DebugManager(self)
self.download_manager = DownloadManager(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() self.admin_privileges.request_admin_privileges()
@@ -81,7 +77,7 @@ class MainWindow(QMainWindow):
) )
sys.exit(1) sys.exit(1)
# 连接信号 # 连接信号 - 绑定到新按钮
self.ui.start_install_btn.clicked.connect(self.download_manager.file_dialog) self.ui.start_install_btn.clicked.connect(self.download_manager.file_dialog)
self.ui.exit_btn.clicked.connect(self.shutdown_app) self.ui.exit_btn.clicked.connect(self.shutdown_app)
@@ -102,7 +98,8 @@ class MainWindow(QMainWindow):
# 但仍然需要跟踪动画状态,防止用户在动画播放过程中退出 # 但仍然需要跟踪动画状态,防止用户在动画播放过程中退出
self.animation_in_progress = True self.animation_in_progress = True
# 禁用开始安装按钮,防止在动画播放期间点击 # 按钮容器初始是隐藏的,无需在这里禁用
# 但确保开始安装按钮仍然处于禁用状态
self.ui.start_install_btn.setEnabled(False) self.ui.start_install_btn.setEnabled(False)
self.animator.animation_finished.connect(self.on_animations_finished) self.animator.animation_finished.connect(self.on_animations_finished)
@@ -426,3 +423,5 @@ class MainWindow(QMainWindow):
event.accept() event.accept()
else: else:
sys.exit(0) sys.exit(0)

View File

@@ -11,11 +11,17 @@ from PySide6.QtGui import (QAction, QBrush, QColor, QConicalGradient,
QTransform) QTransform)
from PySide6.QtWidgets import (QApplication, QLabel, QMainWindow, QMenu, from PySide6.QtWidgets import (QApplication, QLabel, QMainWindow, QMenu,
QMenuBar, QPushButton, QSizePolicy, QWidget) QMenuBar, QPushButton, QSizePolicy, QWidget)
import os
def load_base64_image(base64_str): def load_base64_image(base64_str):
pixmap = QPixmap() pixmap = QPixmap()
pixmap.loadFromData(base64.b64decode(base64_str)) pixmap.loadFromData(base64.b64decode(base64_str))
return pixmap 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): class Ui_MainWindows(object):
def setupUi(self, MainWindows): def setupUi(self, MainWindows):
@@ -33,6 +39,13 @@ class Ui_MainWindows(object):
MainWindows.setAnimated(True) MainWindows.setAnimated(True)
MainWindows.setDocumentMode(False) MainWindows.setDocumentMode(False)
MainWindows.setDockNestingEnabled(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 = QWidget(MainWindows)
self.centralwidget.setObjectName(u"centralwidget") self.centralwidget.setObjectName(u"centralwidget")
self.centralwidget.setAutoFillBackground(True) self.centralwidget.setAutoFillBackground(True)
@@ -71,36 +84,79 @@ class Ui_MainWindows(object):
self.Mainbg.setGeometry(QRect(0, 0, 1031, 561)) self.Mainbg.setGeometry(QRect(0, 0, 1031, 561))
self.Mainbg.setPixmap(load_base64_image(img_data["Mainbg"])) self.Mainbg.setPixmap(load_base64_image(img_data["Mainbg"]))
self.Mainbg.setScaledContents(True) 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.setObjectName(u"start_install_btn")
self.start_install_btn.setEnabled(True) self.start_install_btn.setGeometry(QRect(0, 0, 191, 91))
self.start_install_btn.setGeometry(QRect(780, 250, 191, 91)) self.start_install_btn.setCursor(QCursor(Qt.CursorShape.PointingHandCursor)) # 设置鼠标悬停时为手形光标
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.setFlat(True) 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.setObjectName(u"exit_btn")
self.exit_btn.setEnabled(True) self.exit_btn.setGeometry(QRect(0, 0, 191, 91))
self.exit_btn.setGeometry(QRect(780, 340, 191, 91)) self.exit_btn.setCursor(QCursor(Qt.CursorShape.PointingHandCursor)) # 设置鼠标悬停时为手形光标
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.setFlat(True) 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 = QLabel(self.centralwidget)
self.menubg.setObjectName(u"menubg") self.menubg.setObjectName(u"menubg")
self.menubg.setGeometry(QRect(710, 0, 321, 561)) self.menubg.setGeometry(QRect(710, 0, 321, 561))
@@ -115,8 +171,8 @@ class Ui_MainWindows(object):
self.afterbg.raise_() self.afterbg.raise_()
self.Mainbg.raise_() self.Mainbg.raise_()
self.menubg.raise_() self.menubg.raise_()
self.start_install_btn.raise_() self.button_container.raise_()
self.exit_btn.raise_() self.exit_container.raise_()
self.menubar = QMenuBar(MainWindows) self.menubar = QMenuBar(MainWindows)
self.menubar.setObjectName(u"menubar") self.menubar.setObjectName(u"menubar")
self.menubar.setGeometry(QRect(0, 0, 1024, 21)) self.menubar.setGeometry(QRect(0, 0, 1024, 21))
@@ -146,8 +202,9 @@ class Ui_MainWindows(object):
#if QT_CONFIG(accessibility) #if QT_CONFIG(accessibility)
self.start_install_btn.setAccessibleDescription("") self.start_install_btn.setAccessibleDescription("")
#endif // QT_CONFIG(accessibility) #endif // QT_CONFIG(accessibility)
self.start_install_btn.setText("") # 不再在这里设置文本因为我们已经在setupUi中设置了
self.exit_btn.setText("") # self.start_install_btn.setText("")
# self.exit_btn.setText("")
self.menubg.setText("") self.menubg.setText("")
self.menu.setTitle(QCoreApplication.translate("MainWindows", u"\u8bbe\u7f6e", None)) self.menu.setTitle(QCoreApplication.translate("MainWindows", u"\u8bbe\u7f6e", None))
self.menu_2.setTitle(QCoreApplication.translate("MainWindows", u"\u5e2e\u52a9", None)) self.menu_2.setTitle(QCoreApplication.translate("MainWindows", u"\u5e2e\u52a9", None))