# coding:utf-8 from loguru import logger from PyQt6.QtCore import Qt, QTimer, pyqtSignal from PyQt6.QtGui import ( QColor, QIcon, ) from PyQt6.QtWidgets import QApplication, QHBoxLayout, QVBoxLayout, QWidget from qfluentwidgets import ( ImageLabel, InfoBar, InfoBarPosition, isDarkTheme, MSFluentTitleBar, Pivot, PopUpAniStackedWidget, setThemeColor, VerticalSeparator ) from qframelesswindow import FramelessWindow as Window from app.core import LoginThread, RegisterThread from app.view.widgets.login_widget import LoginWidget from app.view.widgets.register_widget import RegisterWidget from welcome_video import WelcomeVideoPlayer class RegisterWindow(Window): """登录注册页面""" loginSignal = pyqtSignal() def __init__(self, parent=None): logger.info("初始化注册窗口") super().__init__(parent=parent) setThemeColor("#1976d2") self.setTitleBar(MSFluentTitleBar(self)) self.verificationCode = "" self.hBoxLayout = QHBoxLayout(self) self.loginLayout = QVBoxLayout() self.promotionalImageLabel = ImageLabel(self) self.logoImage = ImageLabel(self) self.pivot = Pivot(self) self.stackedWidget = PopUpAniStackedWidget(self) self.loginWidget = LoginWidget(self) self.registerWidget = RegisterWidget(self) self.videoPlayer = WelcomeVideoPlayer(self) self.__initWidgets() logger.info("注册窗口初始化完成") def __initWidgets(self): logger.debug("初始化注册窗口组件") self.titleBar.maxBtn.hide() self.titleBar.setDoubleClickEnabled(False) self.__initLayout() color = QColor(25, 33, 42) if isDarkTheme() else QColor(240, 244, 249) self.setStyleSheet(f"RegisterWindow{{background: {color.name()}}}") self.setWindowIcon(QIcon(":app/images/logo.png")) self.setFixedSize(690, 470) # 设置视频播放器为全窗口大小 self.videoPlayer.setGeometry(0, 0, 690, 470) # 初始时隐藏视频播放器 self.videoPlayer.hide() # self.promotionalImageLabel.setImage(":app/images/background.png") # self.promotionalImageLabel.scaledToWidth(300) self.logoImage.setImage(":app/images/logolong.png") self.logoImage.scaledToWidth(130) self self.pivot.addItem("LoginWidget", "登录", icon=":app/icons/login.svg") # TODO: 内测版本隐藏注册页面 self.pivot.addItem("RegisterWidget", "注册", icon=":app/icons/register.svg") self.pivot.setCurrentItem("LoginWidget") self.pivot.currentItemChanged.connect( lambda routeKey: self.stackedWidget.setCurrentWidget( self.findChild(QWidget, routeKey) ) ) self.loginWidget.loginButton.clicked.connect(self.login) self.registerWidget.registerButton.clicked.connect(self.register) self.stackedWidget.setMaximumWidth(300) self.stackedWidget.addWidget(self.loginWidget) self.stackedWidget.addWidget(self.registerWidget) def show_welcome_video(self): """显示欢迎视频""" # 确保视频播放器显示在最前面 self.videoPlayer.raise_() # 开始播放视频 self.videoPlayer.start_playback() # 再次确保跳过按钮在最顶层 self.videoPlayer.skip_button.raise_() # 连接视频完成信号 self.videoPlayer.videoFinished.connect(self.hide_welcome_video) def hide_welcome_video(self): """隐藏欢迎视频,显示登录界面""" self.videoPlayer.stop_playback() # 确保登录界面元素可见 self.pivot.show() self.stackedWidget.show() self.logoImage.show() self.titleBar.titleLabel.setStyleSheet( """ QLabel{ background: transparent; font: 14px 'Segoe UI', 'Microsoft YaHei', 'PingFang SC'; padding: 0 4px; color: black } """ ) desktop = QApplication.screens()[0].availableGeometry() w, h = desktop.width(), desktop.height() self.move(w // 2 - self.width() // 2, h // 2 - self.height() // 2) self.titleBar.raise_() logger.debug("注册窗口组件初始化完成") def __initLayout(self): logger.debug("初始化注册窗口布局") self.loginLayout.setContentsMargins(10, 40, 10, 40) self.hBoxLayout.setContentsMargins(25, 30, 15, 0) self.loginLayout.addWidget( self.logoImage, 0, Qt.AlignmentFlag.AlignTop | Qt.AlignmentFlag.AlignCenter, ) self.loginLayout.addWidget( self.pivot, 0, Qt.AlignmentFlag.AlignTop | Qt.AlignmentFlag.AlignCenter, ) self.loginLayout.addSpacing(10) self.loginLayout.addWidget(self.stackedWidget) # self.hBoxLayout.addWidget( # self.promotionalImageLabel, 0, Qt.AlignmentFlag.AlignBottom # ) self.hBoxLayout.addSpacing(10) # self.hBoxLayout.addWidget(VerticalSeparator(self)) self.hBoxLayout.addSpacing(10) self.hBoxLayout.addLayout(self.loginLayout) logger.debug("注册窗口布局初始化完成") def keyPressEvent(self, event): if event.key() == Qt.Key.Key_Return or event.key() == Qt.Key.Key_Enter: if self.stackedWidget.currentWidget() == self.loginWidget: self.login() elif self.stackedWidget.currentWidget() == self.registerWidget: self.register() else: super().keyPressEvent(event) def login(self): """登录""" self.loginWidget.loginButton.setEnabled(False) userName = self.loginWidget.emailLineEdit.text() password = self.loginWidget.passwordLineEdit.text() captcha = self.loginWidget.verificationCodeLineEdit.text() if not userName or not password or not captcha: InfoBar.warning( "提示", "你需要填写所有项", Qt.Orientation.Horizontal, True, 2000, InfoBarPosition.TOP_RIGHT, self.window(), ) return self.loginThread = LoginThread(userName, password, captcha) self.loginThread.successLogin.connect(self._loginSuccess) self.loginThread.errorLogin.connect(self._loginFailed) self.loginThread.start() def _loginSuccess(self): InfoBar.success( "成功", "登录成功,正在跳转", Qt.Orientation.Horizontal, True, 1000, InfoBarPosition.TOP_RIGHT, self.window(), ) QTimer.singleShot(500, self.loginSignal.emit) def _loginFailed(self, msg): InfoBar.error( "失败", msg, Qt.Orientation.Horizontal, True, 1000, InfoBarPosition.TOP_RIGHT, self.window(), ) self.loginWidget.refreshVerificationCode() self.loginWidget.verificationCodeLineEdit.clear() self.loginWidget.loginButton.setEnabled(True) def register(self): """注册""" self.registerWidget.registerButton.setEnabled(False) userName = self.registerWidget.emailLineEdit.text() password = self.registerWidget.passwordLineEdit.text() confirmPassword = self.registerWidget.confirmPasswordLineEdit.text() captchaCode = self.registerWidget.verificationCodeLineEdit.text() if not userName or not password or not confirmPassword: InfoBar.warning( "提示", "你需要填写所有项", Qt.Orientation.Horizontal, True, 2000, InfoBarPosition.TOP_RIGHT, self.window(), ) self.registerWidget.registerButton.setEnabled(True) return if password != confirmPassword: InfoBar.warning( "提示", "两次输入的密码不一致", Qt.Orientation.Horizontal, True, 2000, InfoBarPosition.TOP_RIGHT, self.window(), ) self.registerWidget.confirmPasswordLineEdit.clear() self.registerWidget.registerButton.setEnabled(True) return self.registerThread = RegisterThread(userName, password, captchaCode) self.registerThread.successRegister.connect(self._registerSuccess) self.registerThread.errorRegister.connect(self._registerFailed) self.registerThread.start() def _registerSuccess(self): InfoBar.info( "成功", "注册成功,请前往邮箱激活账号", Qt.Orientation.Horizontal, True, -1, InfoBarPosition.TOP_RIGHT, self.window(), ) self.stackedWidget.setCurrentWidget(self.loginWidget) self.loginWidget.emailLineEdit.setText(self.registerWidget.emailLineEdit.text()) self.registerWidget.emailLineEdit.clear() self.registerWidget.passwordLineEdit.clear() self.registerWidget.confirmPasswordLineEdit.clear() self.registerWidget.registerButton.setEnabled(True) def _registerFailed(self, msg): InfoBar.error( "失败", msg, Qt.Orientation.Horizontal, True, 1000, InfoBarPosition.TOP_RIGHT, self.window(), ) self.registerWidget.refreshVerificationCode() self.registerWidget.verificationCodeLineEdit.clear() self.registerWidget.passwordLineEdit.clear() self.registerWidget.confirmPasswordLineEdit.clear() self.registerWidget.emailLineEdit.clear() self.registerWidget.registerButton.setEnabled(True)