from loguru import logger from PyQt6.QtCore import QRegularExpression, Qt, pyqtSignal from PyQt6.QtGui import ( QRegularExpressionValidator, ) from PyQt6.QtWidgets import QHBoxLayout, QLabel, QVBoxLayout, QWidget from qfluentwidgets import ( CheckBox, LineEdit, PasswordLineEdit, PushButton, ) from app.core import CaptchaThread,cfg, qconfig class LoginWidget(QWidget): loginSignal = pyqtSignal(dict) def __init__(self, parent=None): logger.debug("初始化登录组件") super().__init__(parent) self.setObjectName("LoginWidget") self.setWindowTitle("LeonPan") self.emailLineEdit = LineEdit(self) self.emailLineEdit.setPlaceholderText("请输入邮箱") self.passwordLineEdit = PasswordLineEdit(self) self.passwordLineEdit.setPlaceholderText("请输入密码") self.rememberMeCheckBox = CheckBox("记住我", self) self.rememberMeCheckBox.checkStateChanged.connect( lambda: qconfig.set(cfg.rememberMe, self.rememberMeCheckBox.isChecked()) ) self.loginButton = PushButton("登录", self) self.loginButton.setDisabled(False) self.verificationCodeLabel = QLabel(self) self.verificationCodeLabel.setFixedSize(120, 35) self.verificationCodeLabel.setScaledContents(True) # 设置图片自适应 self.verificationCodeLabel.mousePressEvent = ( self.refreshVerificationCode ) # 绑定点击事件 self.verificationCodeLineEdit = LineEdit(self) self.verificationCodeLineEdit.setPlaceholderText("请输入验证码") self.verificationLayout = QHBoxLayout() self.verificationLayout.setAlignment(Qt.AlignmentFlag.AlignVCenter) self.verificationLayout.addWidget(self.verificationCodeLineEdit) self.verificationLayout.addWidget(self.verificationCodeLabel) self.vBoxLayout = QVBoxLayout(self) self.vBoxLayout.setAlignment(Qt.AlignmentFlag.AlignTop) self.vBoxLayout.addSpacing(10) self.vBoxLayout.addWidget(self.emailLineEdit) self.vBoxLayout.addSpacing(15) self.vBoxLayout.addWidget(self.passwordLineEdit) self.vBoxLayout.addSpacing(15) self.vBoxLayout.addLayout(self.verificationLayout) self.vBoxLayout.addSpacing(15) self.vBoxLayout.addWidget( self.rememberMeCheckBox, 0, Qt.AlignmentFlag.AlignLeft ) self.vBoxLayout.addSpacing(15) self.vBoxLayout.addWidget(self.loginButton) email_regex = QRegularExpression( r"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$" ) # TODO: 内测时用的邮箱匹配 # email_regex = QRegularExpression(r"^[a-zA-Z0-9_.+-]+@miaostars\.cn$") validator = QRegularExpressionValidator(email_regex, self) self.emailLineEdit.setValidator(validator) self.emailLineEdit.textChanged.connect(self.checkEmail) self.refreshVerificationCode() self.rememberMe() logger.debug("登录组件初始化完成") def rememberMe(self): logger.debug("检查记住我选项") if qconfig.get(cfg.rememberMe): logger.debug("已启用记住我功能,填充保存的邮箱和密码") self.emailLineEdit.setText(qconfig.get(cfg.email)) self.passwordLineEdit.setText(qconfig.get(cfg.activationCode)) self.rememberMeCheckBox.setChecked(True) else: logger.debug("已禁用记住我功能,清空保存的邮箱和密码") self.emailLineEdit.clear() self.passwordLineEdit.clear() def checkEmail(self, text): # 检查当前输入是否通过验证器 state, _, _ = self.emailLineEdit.validator().validate(text, 0) if state == QRegularExpressionValidator.State.Acceptable: logger.debug("邮箱格式验证通过") self.loginButton.setDisabled(False) else: self.loginButton.setDisabled(True) def refreshVerificationCode(self, event=None): logger.debug("刷新验证码") self.verificationCodeLabel.setEnabled(False) self.captchaThread = CaptchaThread() self.captchaThread.captchaReady.connect(self._showVerificationCode) self.captchaThread.captchaFailed.connect(self._showCaptchaFailed) self.captchaThread.start() def _showVerificationCode(self, pixmap): logger.debug("显示验证码") self.verificationCodeLabel.setEnabled(True) self.verificationCodeLabel.setPixmap(pixmap) def _showCaptchaFailed(self, message): logger.debug(f"验证码刷新失败:{message}") self.verificationCodeLabel.setEnabled(True) self.verificationCodeLineEdit.clear()