mirror of
https://gitee.com/Zhaoxin59/my-chat_-client.git
synced 2026-02-13 16:41:48 +08:00
485 lines
15 KiB
C++
485 lines
15 KiB
C++
#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, [=](bool ok) {
|
||
//不需要做其他的处理,只需要提示一下,验证码已经发送出去了
|
||
if (!ok) {
|
||
return;
|
||
}
|
||
LOG() << "ok: " << ok;
|
||
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);
|
||
|
||
}
|
||
|
||
|