#include "selfinfowidget.h" #include "model/datacenter.h" using namespace model; SelfInfoWidget::SelfInfoWidget(QWidget *parent) : QDialog(parent) { //设置整个窗口的属性 this->setFixedSize(500, 200); this->setWindowTitle("个人信息"); this->setWindowIcon(QIcon(":/resource/image/logo.png")); //窗口被关闭时,自动销毁这个对话框对象 this->setAttribute(Qt::WA_DeleteOnClose); //把窗口移动到鼠标当前的位置 this->move(QCursor::pos()); //创建布局管理器 layout = new QGridLayout(); //layout->setSpacing(0); layout->setHorizontalSpacing(10); layout->setVerticalSpacing(3); layout->setContentsMargins(20, 20, 20, 0); layout->setAlignment(Qt::AlignTop); this->setLayout(layout); //创建头像 avatarBtn = new QPushButton(); avatarBtn->setFixedSize(75, 75); avatarBtn->setIconSize(QSize(75, 75)); avatarBtn->setStyleSheet("QPushButton { border: none; background-color: transparent; }"); QString labelStyle = "QLabel { font-size: 14px; font-weight: 800; }"; QString btnStyle = "QPushButton {border: none; background-color: transparent; }"; btnStyle += "QPushButton:pressed { background-color: rgb(210, 210, 210); }"; QString editStyle = "QLineEdit { border: none; background-color: rgb(250 ,250, 250); color: rgb(0, 0, 0); border-radius: 5px; padding-left: 2px; }"; int height = 30; //添加用户的ID的显示 idTag = new QLabel(); idTag->setFixedSize(50, height); idTag->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); idTag->setText("ID"); idTag->setStyleSheet(labelStyle); idLabel = new QLabel(); idLabel->setFixedHeight(height); idLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); //添加新的用户的名字的显示 nameTag = new QLabel(); nameTag->setFixedSize(50, height); nameTag->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); nameTag->setText("昵称"); nameTag->setStyleSheet(labelStyle); nameLabel = new QLabel(); nameLabel->setFixedHeight(height); nameLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); nameModifyBtn = new QPushButton(); nameModifyBtn->setFixedSize(70, 25); nameModifyBtn->setIconSize(QSize(20, 20)); nameModifyBtn->setIcon(QIcon(":/resource/image/modify.png")); nameModifyBtn->setStyleSheet(btnStyle); nameEdit = new QLineEdit(); nameEdit->setFixedHeight(height); nameEdit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); nameEdit->setStyleSheet(btnStyle); nameEdit->hide(); nameSubmitBtn = new QPushButton(); nameSubmitBtn->setFixedSize(70, 25); nameSubmitBtn->setIconSize(QSize(20, 20)); nameSubmitBtn->setIcon(QIcon(":/resource/image/submit.png")); nameSubmitBtn->setStyleSheet(btnStyle); nameSubmitBtn->hide(); //添加个性签名 descTag = new QLabel(); descTag->setFixedSize(50, height); descTag->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); descTag->setText("签名"); descTag->setStyleSheet(labelStyle); descLabel = new QLabel(); descLabel->setFixedHeight(height); descLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); descModifyBtn = new QPushButton(); descModifyBtn->setFixedSize(70, 25); descModifyBtn->setIconSize(QSize(20, 20)); descModifyBtn->setIcon(QIcon(":/resource/image/modify.png")); descModifyBtn->setStyleSheet(btnStyle); descEdit = new QLineEdit(); descEdit->setFixedHeight(height); descEdit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); descEdit->setStyleSheet(btnStyle); descEdit->hide(); descSubmitBtn = new QPushButton(); descSubmitBtn->setFixedSize(70, 25); descSubmitBtn->setIconSize(QSize(20, 20)); descSubmitBtn->setIcon(QIcon(":/resource/image/submit.png")); descSubmitBtn->setStyleSheet(btnStyle); descSubmitBtn->hide(); // 7. 添加电话 phoneTag = new QLabel(); phoneTag->setFixedSize(50, height); phoneTag->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); phoneTag->setText("邮箱"); phoneTag->setStyleSheet(labelStyle); phoneLabel = new QLabel(); phoneLabel->setFixedHeight(height); phoneLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); //phoneLabel->setStyleSheet("QLabel {background-color: rgb(255, 255, 255); }"); phoneModifyBtn = new QPushButton(); phoneModifyBtn->setFixedSize(70, 25); phoneModifyBtn->setIconSize(QSize(20, 20)); phoneModifyBtn->setIcon(QIcon(":/resource/image/modify.png")); phoneModifyBtn->setStyleSheet(btnStyle); phoneEdit = new QLineEdit(); phoneEdit->setFixedHeight(height); phoneEdit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); phoneEdit->setStyleSheet(editStyle); //phoneEdit->setStyleSheet("QLineEdit {background-color: rgb(245, 245, 245); }"); phoneEdit->hide(); phoneSubmitBtn = new QPushButton(); phoneSubmitBtn->setFixedSize(70, 25); phoneSubmitBtn->setIconSize(QSize(20, 20)); phoneSubmitBtn->setIcon(QIcon(":/resource/image/submit.png")); phoneSubmitBtn->setStyleSheet(btnStyle); phoneSubmitBtn->hide(); // 8. 添加验证码 verifyCodeTag = new QLabel(); verifyCodeTag->setFixedSize(50, height); verifyCodeTag->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); verifyCodeTag->setText("验证码:"); verifyCodeTag->setStyleSheet(labelStyle); verifyCodeTag->hide(); verifyCodeEdit = new QLineEdit(); verifyCodeEdit->setFixedHeight(height); verifyCodeEdit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); verifyCodeEdit->setStyleSheet(editStyle); verifyCodeEdit->hide(); getVerifyCodeBtn = new QPushButton(); getVerifyCodeBtn->setText("获取验证码"); getVerifyCodeBtn->setFixedSize(70, height); getVerifyCodeBtn->setStyleSheet(R"(QPushButton { border: none; background-color: transparent; color: rgb(0, 0, 0); } QPushButton:pressed { background-color: rgb(231, 231, 231); } )"); getVerifyCodeBtn->hide(); layout->addWidget(avatarBtn, 0, 0, 3, 1); layout->addWidget(idTag, 0, 1); layout->addWidget(idLabel, 0, 2); layout->addWidget(nameTag, 1, 1); layout->addWidget(nameLabel, 1, 2); layout->addWidget(nameModifyBtn, 1, 3); layout->addWidget(descTag, 2, 1); layout->addWidget(descLabel, 2, 2); layout->addWidget(descModifyBtn, 2, 3); layout->addWidget(phoneTag, 3, 1); layout->addWidget(phoneLabel, 3, 2); layout->addWidget(phoneModifyBtn, 3, 3); /*layout->addWidget(verifyCodeTag, 4, 1); layout->addWidget(verifyCodeEdit, 4, 2); layout->addWidget(getVerifyCodeBtn, 4, 3);*/ #if TEST_UI idLabel->setText("12345"); nameLabel->setText("xyz"); descLabel->setText("It didn't matter that i lived another day."); phoneLabel->setText("12345678900"); //此处只做测试,不要让界面显示默认头像 avatarBtn->setIcon(QIcon(":/resource/image/defaultAvatar.png")); #endif initSingnalSlots(); //加载数据到界面上 DataCenter* dataCenter = DataCenter::getInstance(); UserInfo* myself = dataCenter->getMyselfsync(); if (myself != nullptr) { //把个人信息加载到界面上 avatarBtn->setIcon(myself->avatar); idLabel->setText(myself->userId); nameLabel->setText(myself->nickname); descLabel->setText(myself->description); phoneLabel->setText(myself->phone); } /*connect(nameSubmitBtn, &QPushButton::clicked, this, &SelfInfoWidget::clickNameSubmitBtn); connect(descSubmitBtn, &QPushButton::clicked, this, &SelfInfoWidget::clickDescSubmitBtn); connect(getVerifyCodeBtn, &QPushButton::clicked, this, &SelfInfoWidget::clickGetVerifyCodeBtn); connect(phoneSubmitBtn, &QPushButton::clicked, this, &SelfInfoWidget::clickPhoneSubmitBtn); connect(avatarBtn, &QPushButton::clicked, this, &SelfInfoWidget::clickAvatarBtn);*/ } void SelfInfoWidget::initSingnalSlots() { //添加连接的槽函数 connect(nameModifyBtn, &QPushButton::clicked, this, [=]() { //把当前的nameLabel和nameModifyBtn隐藏起来 nameLabel->hide(); nameModifyBtn->hide(); layout->removeWidget(nameLabel); layout->removeWidget(nameModifyBtn); //把nameEdit和nameSubmitBtn显示出来 nameEdit->show(); nameSubmitBtn->show(); layout->addWidget(nameEdit, 1, 2); layout->addWidget(nameSubmitBtn, 1, 3); //把输入框的内容进行设置 nameEdit->setText(nameLabel->text()); }); connect(descModifyBtn, &QPushButton::clicked, this, [=]() { descLabel->hide(); descModifyBtn->hide(); layout->removeWidget(descLabel); layout->removeWidget(descModifyBtn); descEdit->show(); descSubmitBtn->show(); layout->addWidget(descEdit, 2, 2); layout->addWidget(descSubmitBtn, 2, 3); descEdit->setText(descLabel->text()); }); connect(phoneModifyBtn, &QPushButton::clicked, this, [=]() { phoneLabel->hide(); phoneModifyBtn->hide(); layout->removeWidget(phoneLabel); layout->removeWidget(phoneModifyBtn); phoneEdit->show(); phoneSubmitBtn->show(); layout->addWidget(phoneEdit, 3, 2); layout->addWidget(phoneSubmitBtn, 3, 3); verifyCodeTag->show(); verifyCodeEdit->show(); getVerifyCodeBtn->show(); layout->addWidget(verifyCodeTag, 4, 1); layout->addWidget(verifyCodeEdit, 4, 2); layout->addWidget(getVerifyCodeBtn, 4, 3); phoneEdit->setText(phoneLabel->text()); }); connect(nameSubmitBtn, &QPushButton::clicked, this, &SelfInfoWidget::clickNameSubmitBtn); connect(descSubmitBtn, &QPushButton::clicked, this, &SelfInfoWidget::clickDescSubmitBtn); connect(getVerifyCodeBtn, &QPushButton::clicked, this, &SelfInfoWidget::clickGetVerifyCodeBtn); connect(phoneSubmitBtn, &QPushButton::clicked, this, &SelfInfoWidget::clickPhoneSubmitBtn); connect(avatarBtn, &QPushButton::clicked, this, &SelfInfoWidget::clickAvatarBtn); } void SelfInfoWidget::clickNameSubmitBtn() { //从输入框中拿到修改后的呢称 const QString& nickName = nameEdit->text(); if (nickName.isEmpty()) { return; } //发送网络请求 DataCenter* dataCenter = DataCenter::getInstance(); connect(dataCenter, &DataCenter::changeNicknameDone, this, &SelfInfoWidget::clickNameSubmitBtnDone, Qt::UniqueConnection); dataCenter->changeNicknameAsync(nickName); } void SelfInfoWidget::clickNameSubmitBtnDone() { //对界面控件进行切换, 把输入框切换为label, 把提交按钮切换为编辑按钮 //同时要把输入框的内容设置为修改后的呢称 layout->removeWidget(nameEdit); nameEdit->hide(); layout->addWidget(nameLabel, 1, 2); nameLabel->show(); nameLabel->setText(nameEdit->text()); layout->removeWidget(nameSubmitBtn); nameSubmitBtn->hide(); layout->addWidget(nameModifyBtn, 1, 3); nameModifyBtn->show(); } void SelfInfoWidget::clickDescSubmitBtn() { //从输入框拿到输入的签名内容 const QString& desc = descEdit->text(); if (desc.isEmpty()) { return; } //发送网络请求 DataCenter* dataCenter = DataCenter::getInstance(); connect(dataCenter, &DataCenter::changeDescriptionDone, this, &SelfInfoWidget::clickDescSubmitBtnDone, Qt::UniqueConnection); dataCenter->changeDescriptionAsync(desc); } void SelfInfoWidget::clickDescSubmitBtnDone() { //切换界面 //把label替换为输入框,把提交按钮替换为编辑按钮 layout->removeWidget(descEdit); descEdit->hide(); layout->addWidget(descLabel, 2, 2); descLabel->show(); descLabel->setText(descEdit->text()); layout->removeWidget(descSubmitBtn); descSubmitBtn->hide(); layout->addWidget(descModifyBtn, 2, 3); descModifyBtn->show(); } void SelfInfoWidget::clickGetVerifyCodeBtn() { //获取到输入框的邮箱号 const QString& email = phoneEdit->text(); if (email.isEmpty()) { QTimer* timer = new QTimer(this); int* leftTime = new int(2); phoneEdit->setPlaceholderText("请输入邮箱"); phoneEdit->setStyleSheet("QLineEdit { border: 1px solid red; background-color: rgb(255, 220, 220); color: rgb(0, 0, 0); border-radius: 5px; padding-left: 2px; }"); connect(timer, &QTimer::timeout, this, [=]() { if (*leftTime <= 0) { phoneEdit->setPlaceholderText(""); phoneEdit->setStyleSheet("QLineEdit { border: none; background-color: rgb(250 ,250, 250); color: rgb(0, 0, 0); border-radius: 5px; padding-left: 2px; }"); timer->stop(); timer->deleteLater(); delete timer; delete leftTime; return; } (*leftTime)--; }); timer->start(1000); // 1秒后清除提示 return; } //给服务器发送请求 DataCenter* dataCenter = DataCenter::getInstance(); connect(dataCenter, &DataCenter::getVerifyCodeDone, this, [=]() { //不需要做其他的处理,只需要提示一下,验证码已经发送出去了 Toast::showMessage("验证码已发送,请注意查收"); }); dataCenter->getVerifyCodeAsync(email); //把刚才发送请求的邮箱号码保存起来 this->emailToChange = email; //禁用发送验证码的按钮,给出倒计时 this->getVerifyCodeBtn->setEnabled(false); leftTime = 30; // 倒计时30秒 QTimer* timer = new QTimer(this); connect(timer, &QTimer::timeout, this, [=]() { if (leftTime <= 0) { //倒计时结束 getVerifyCodeBtn->setEnabled(true); getVerifyCodeBtn->setText("获取验证码"); timer->stop(); timer->deleteLater(); return; } (leftTime)--; getVerifyCodeBtn->setText(QString::number(leftTime) + "s"); }); timer->start(1000); // 每秒更新一次 } void SelfInfoWidget::clickPhoneSubmitBtn() { //判定,当前的验证码是否已经收到 DataCenter* dataCenter = DataCenter::getInstance(); QString verifyCodeId = dataCenter->getVerifyCodeId(); if (verifyCodeId.isEmpty()) { //服务器还没有返回验证码响应 Toast::showMessage("服务器未返回响应,请稍后重试"); return; } //如果当前已经拿到了verifyCodeId,就可以清空DataCenter中存储的值了,确保下次点击提交按钮的时候,不会影响当次的逻辑 dataCenter->resetVerifyCodeId(""); //获取到用户输入的验证码 QString verifyCode = verifyCodeEdit->text(); if (verifyCode.isEmpty()) { Toast::showMessage("验证码不能为空"); return; } verifyCodeEdit->setText(""); //发送请求,把当前验证码信息,发送给服务器 connect(dataCenter, &DataCenter::changePhoneDone, this, &SelfInfoWidget::clickPhoneSubmitBtnDone, Qt::UniqueConnection); dataCenter->changePhoneAsync(this->emailToChange, verifyCodeId, verifyCode); leftTime = 1; } void SelfInfoWidget::clickPhoneSubmitBtnDone() { layout->removeWidget(verifyCodeTag); layout->removeWidget(verifyCodeEdit); layout->removeWidget(getVerifyCodeBtn); layout->removeWidget(phoneEdit); layout->removeWidget(phoneSubmitBtn); verifyCodeTag->hide(); verifyCodeEdit->hide(); getVerifyCodeBtn->hide(); phoneEdit->hide(); phoneSubmitBtn->hide(); layout->addWidget(phoneLabel, 3, 2); phoneLabel->show(); layout->addWidget(phoneModifyBtn, 3, 3); phoneModifyBtn->show(); phoneLabel->setText(this->emailToChange); } void SelfInfoWidget::clickAvatarBtn() { //弹出对话框,选择文件 QString filter = "Image Files (*.png *.jpg *.jpeg)"; QString imagePath = QFileDialog::getOpenFileName(this, "选择头像", QDir::homePath(), filter); if (imagePath.isEmpty()) { //用户取消了 LOG() << "用户没有选择任何头像文件"; return; } //根据路径,读取到图片的内容 QByteArray imageBytes = loadFileToByteArray(imagePath); //发送请求,修改头像 DataCenter* dataCenter = DataCenter::getInstance(); connect(dataCenter, &DataCenter::changeAvatarDone, this, &SelfInfoWidget::clickAvatarBtnDone, Qt::UniqueConnection); dataCenter->changeAvatarAsync(imageBytes); } void SelfInfoWidget::clickAvatarBtnDone() { //设置头像,更新到界面上 DataCenter* dataCenter = DataCenter::getInstance(); avatarBtn->setIcon(dataCenter->getMyselfsync()->avatar); }