#include "phoneloginwidget.h" #include "mainwidget.h" #include "model/datacenter.h" #include "toast.h" using namespace model; PhoneLoginWidget::PhoneLoginWidget(QWidget *parent) : QWidget(parent) { // 1. 设置窗口的基本属性 this->setFixedSize(400, 350); this->setWindowTitle("登录"); this->setWindowIcon(QIcon(":/resource/image/logo.png")); this->setStyleSheet("QWidget { background-color: rgb(255, 255, 255); color: rgb(0, 0, 0); }"); this->setAttribute(Qt::WA_DeleteOnClose); // 2. 创建核心布局管理器 QGridLayout* layout = new QGridLayout(); layout->setSpacing(10); layout->setContentsMargins(50, 0, 50, 0); this->setLayout(layout); // 3. 创建标题 titleLabel = new QLabel(); titleLabel->setText("登录"); titleLabel->setFixedHeight(50); titleLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); titleLabel->setStyleSheet("QLabel { font-size: 40px; font-weight: 600; }"); titleLabel->setAlignment(Qt::AlignCenter); // 4. 创建手机号输入框 QString editStyle = "QLineEdit { border: none; background-color: rgb(240, 240, 240); font-size: 20px; border-radius: 10px; padding-left: 5px;}"; phoneEdit = new QLineEdit(); phoneEdit->setPlaceholderText("输入邮箱号"); phoneEdit->setFixedHeight(40); phoneEdit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); phoneEdit->setStyleSheet(editStyle); // 5. 创建验证码输入框 verifyCodeEdit = new QLineEdit(); verifyCodeEdit->setPlaceholderText("输入验证码"); verifyCodeEdit->setFixedHeight(40); verifyCodeEdit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); verifyCodeEdit->setStyleSheet(editStyle); // 6. 创建发送验证码按钮 QString btnWhiteStyle = "QPushButton { border: none; border-radius: 10px; background-color: transparent; }"; btnWhiteStyle += "QPushButton:pressed { background-color: rgb(240, 240, 240); }"; sendVerifyCodeBtn = new QPushButton(); sendVerifyCodeBtn->setFixedSize(100, 40); sendVerifyCodeBtn->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); sendVerifyCodeBtn->setText("发送验证码"); sendVerifyCodeBtn->setStyleSheet(btnWhiteStyle); // 7. 创建提交按钮 submitBtn = new QPushButton(); submitBtn->setFixedHeight(40); submitBtn->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); submitBtn->setText("登录"); QString btnGreenStyle = "QPushButton { border: none; border-radius: 10px; background-color: rgb(44, 182, 61); color: rgb(255, 255, 255); }"; btnGreenStyle += "QPushButton:pressed { background-color: rgb(240, 240, 240); }"; submitBtn->setStyleSheet(btnGreenStyle); // 8. 创建 "切换到用户名" 模式按钮 QPushButton* userModeBtn = new QPushButton(); userModeBtn->setFixedSize(100, 40); userModeBtn->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); userModeBtn->setText("切换到用户名"); userModeBtn->setStyleSheet(btnWhiteStyle); // 9. 切换登录注册模式 switchModeBtn = new QPushButton(); switchModeBtn->setFixedSize(100, 40); switchModeBtn->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); switchModeBtn->setText("注册"); switchModeBtn->setStyleSheet(btnWhiteStyle); // 10. 添加到布局管理器 layout->addWidget(titleLabel, 0, 0, 1, 5); layout->addWidget(phoneEdit, 1, 0, 1, 5); layout->addWidget(verifyCodeEdit, 2, 0, 1, 4); layout->addWidget(sendVerifyCodeBtn, 2, 4, 1, 1); layout->addWidget(submitBtn, 3, 0, 1, 5); layout->addWidget(userModeBtn, 4, 0, 1, 1); layout->addWidget(switchModeBtn, 4, 4, 1, 1); // 11. 添加信号槽 connect(switchModeBtn, &QPushButton::clicked, this, &PhoneLoginWidget::switchMode); //connect(switchModeBtn, &QPushButton::clicked, this, [=]() { // if (isLoginMode) { // //切换到注册模式 // this->setWindowTitle("注册"); // titleLabel->setText("注册"); // submitBtn->setText("注册"); // switchModeBtn->setText("登录"); // } // else { // //切换到登录模式 // this->setWindowTitle("登录"); // titleLabel->setText("登录"); // submitBtn->setText("登录"); // switchModeBtn->setText("注册"); // } // isLoginMode = !isLoginMode; // }); connect(userModeBtn, &QPushButton::clicked, this, [=]() { LoginWidget* loginWidget = new LoginWidget(nullptr); loginWidget->show(); this->close(); }); connect(sendVerifyCodeBtn, &QPushButton::clicked, this, &PhoneLoginWidget::sendVerifyCode); timer = new QTimer(this); connect(timer, &QTimer::timeout, this, &PhoneLoginWidget::countDown); connect(submitBtn, &QPushButton::clicked, this, &PhoneLoginWidget::clickSubmitBtn); } void PhoneLoginWidget::sendVerifyCode() { sendVerifyCodeBtn->setEnabled(false); sendVerifyCodeBtn->setStyleSheet("QPushButton { color: rgb(200, 200, 200); }"); //获取到手机验证码 const QString& phone = this->phoneEdit->text(); if (phone.isEmpty()) { return; } this->currentPhone = phone; //发送网络请求,获取验证吗 DataCenter* dataCenter = DataCenter::getInstance(); connect(dataCenter, &DataCenter::getVerifyCodeDone, this, &PhoneLoginWidget::sendVerifyCodeDone, Qt::AutoConnection); dataCenter->getVerifyCodeAsync(phone); //开启定时器,开始倒计时 timer->start(1000); } void PhoneLoginWidget::sendVerifyCodeDone(bool ok) { if (!ok) { Toast::showMessage("邮箱格式错误"); sendVerifyCodeBtn->setEnabled(true); sendVerifyCodeBtn->setText("发送验证码"); timer->stop(); sendVerifyCodeBtn->setStyleSheet("QPushButton { color: rgb(0, 0, 0); }"); } else { Toast::showMessage("验证码已发送"); } } void PhoneLoginWidget::clickSubmitBtn() { //从输入框中拿到必要的内容 const QString& phone = phoneEdit->text(); const QString& verifyCode = verifyCodeEdit->text(); if (phone.isEmpty() || verifyCode.isEmpty()) { Toast::showMessage("电话或验证码不应该为空"); return; } //发送请求 DataCenter* dataCenter = DataCenter::getInstance(); if (isLoginMode) { //登录 connect(dataCenter, &DataCenter::phoneLoginDone, this, &PhoneLoginWidget::phoneLoginDone, Qt::AutoConnection); dataCenter->phoneLoginAsync(phone, verifyCode); } else { //注册 connect(dataCenter, &DataCenter::phoneRegisterDone, this, &PhoneLoginWidget::phoneRegisterDone, Qt::UniqueConnection); dataCenter->phoneRegisterAsync(phone, verifyCode); } } void PhoneLoginWidget::phoneLoginDone(bool ok, const QString& reason) { if (!ok) { Toast::showMessage("登录失败:" + reason); return; } //跳转到主窗口 MainWidget* mainWidget = MainWidget::getInstance(); mainWidget->show(); //关闭自己 this->close(); } void PhoneLoginWidget::phoneRegisterDone(bool ok, const QString& reason) { if (!ok) { Toast::showMessage("注册失败:" + reason); return; } Toast::showMessage("注册成功"); //跳转到登录页面 switchMode(); //清空一下输入框 verifyCodeEdit->clear(); //处理一下倒计时按钮 leftTime = 1; } void PhoneLoginWidget::countDown() { if (leftTime <= 1) { //时间到了,发送按钮设为可用,并停止定时器 sendVerifyCodeBtn->setEnabled(true); sendVerifyCodeBtn->setText("发送验证码"); timer->stop(); sendVerifyCodeBtn->setStyleSheet("QPushButton { color: rgb(0, 0, 0); }"); return; } leftTime -= 1; sendVerifyCodeBtn->setText(QString::number(leftTime) + " s"); if (sendVerifyCodeBtn->isEnabled()) { sendVerifyCodeBtn->setEnabled(false); } } void PhoneLoginWidget::switchMode() { if (isLoginMode) { //切换到注册模式 this->setWindowTitle("注册"); titleLabel->setText("注册"); submitBtn->setText("注册"); switchModeBtn->setText("登录"); } else { //切换到登录模式 this->setWindowTitle("登录"); titleLabel->setText("登录"); submitBtn->setText("登录"); switchModeBtn->setText("注册"); } isLoginMode = !isLoginMode; }