一、消息展示区
消息展示区需要再MessageShowArea文件里编写代码
目前只完成了文本消息:
MessageShowArea.h文件
#include <QScrollArea>
#include <QWidget>
#include <QLabel>
#include <QPushButton>
#include "model/data.h"
#include "debug.h"
// .h 文件中不宜进行 using namespace xxxx
using model::Message;
////////////////////////////////////////////////////////
/// 消息展示区
////////////////////////////////////////////////////////
class MessageShowArea : public QScrollArea
{
Q_OBJECT
public:
MessageShowArea();
// 尾插
void addMessage(bool isLeft, const Message& message);
// 头插
void addFrontMessage(bool isLeft, const Message& message);
// 清空消息
void clear();
// 滚动到末尾
void scrollToEnd();
private:
QWidget* container;
};
////////////////////////////////////////////////////////
/// 表示一个消息元素
/// 这个里面要能同时支持 文本消息, 图片消息, 文件消息, 语音消息.
/// 当前先只考虑文本消息. 另外几个后续慢慢添加.
////////////////////////////////////////////////////////
class MessageItem : public QWidget {
Q_OBJECT
public:
// 此处的 isLeft 表示这个 Item 是否是一个 "左侧消息"
MessageItem(bool isLeft);
// 通过 工厂方法 创建 MessageItem 实例
static MessageItem* makeMessageItem(bool isLeft, const Message& message);
// 添加工厂函数
static QWidget* makeTextMessageItem(bool isLeft, const QString& message);
static QWidget* makeImageMessageItem();
static QWidget* makeFileMessageItem();
static QWidget* makeSpeechMessageItem();
private:
bool isLeft;
};
////////////////////////////////////////////////////////
/// 创建类表示 "文本消息" 正文部分
////////////////////////////////////////////////////////
class MessageContentLabel : public QWidget {
public:
// fileName 可以作为 text 的一部分, 传递进来. 不需要单独列一个参数
MessageContentLabel(const QString& text, bool isLeft);
void paintEvent(QPaintEvent* event) override;
private:
QLabel* label;
bool isLeft;
model::MessageType messageType;
QString fileId;
QByteArray content;
bool loadContentDone = false;
};
MessageShowArea.cpp文件
#include <QScrollBar>
#include <QVBoxLayout>
#include <QPushButton>
#include <QLabel>
#include <QFontMetrics>
#include <QPainter>
#include <QPainterPath>
#include <QFileDialog>
#include <QTimer>
#include <QMenu>
MessageShowArea::MessageShowArea() {
// 1. 初始化基本属性
this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
this->setWidgetResizable(true);
// 设置滚动条的样式
this->verticalScrollBar()->setStyleSheet("QScrollBar:vertical { width: 2px; background-color: rgb(240, 240, 240); }");
this->horizontalScrollBar()->setStyleSheet("QScrollBar:horizontal { height: 0;}");
this->setStyleSheet("QScrollArea { border: none; }");
// 2. 创建 Container 这样的 widget, 作为包含内部元素的容器
container = new QWidget();
this->setWidget(container);
// 3. 给 container 添加布局管理器
QVBoxLayout* layout = new QVBoxLayout();
layout->setSpacing(0);
layout->setContentsMargins(0, 0, 0, 0);
container->setLayout(layout);
// 添加 "构造测试数据" 逻辑.
#if TEST_UI
for (int i = 1; i <= 30; ++i) {
model::UserInfo userInfo;
userInfo.userId = QString::number(1000 + i);
userInfo.nickname = "张三" + QString::number(i);
userInfo.description = "从今天开始认真敲代码";
userInfo.avatar = QIcon(":/resource/image/defaultAvatar.png");
userInfo.phone = "18612345678";
Message message = Message::makeMessage(model::TEXT_TYPE, "", userInfo, (QString("这是一条测试消息") + QString::number(i)).toUtf8(), "");
this->addMessage(true, message);
}
#endif
}
void MessageShowArea::addMessage(bool isLeft, const Message &message)
{
// 构造 MessageItem, 添加到布局管理器中.
MessageItem* messageItem = MessageItem::makeMessageItem(isLeft, message);
container->layout()->addWidget(messageItem);
}
void MessageShowArea::addFrontMessage(bool isLeft, const Message &message)
{
MessageItem* messageItem = MessageItem::makeMessageItem(isLeft, message);
QVBoxLayout* layout = dynamic_cast<QVBoxLayout*>(container->layout());
layout->insertWidget(0, messageItem);
}
void MessageShowArea::clear()
{
// 遍历布局管理器, 删除里面的元素
QLayout* layout = container->layout();
for (int i = layout->count() - 1; i >= 0; --i) {
QLayoutItem* item = layout->takeAt(i);
if (item != nullptr && item->widget() != nullptr) {
delete item->widget();
}
}
}
void MessageShowArea::scrollToEnd()
{
// 实现思路:
// 拿到滚动区域中的滚动条(垂直滚动条)
// 获取到滚动条的最大值
// 根据最大值, 设置滚动条的滚动位置.
// 为了使滚动效果更佳, 能够在界面绘制好之后进行滚动条的设置
// 给这里的滚动操作, 加上个 "延时"
QTimer* timer = new QTimer();
connect(timer, &QTimer::timeout, this, [=]() {
// 获取到垂直滚动条的最大值
int maxValue = this->verticalScrollBar()->maximum();
// 设置滚动条的滚动位置
this->verticalScrollBar()->setValue(maxValue);
timer->stop();
timer->deleteLater();
});
timer->start(500);
}
///////////////////////////////////////////////////////
/// 表示一个消息元素
////////////////////////////////////////////////////////
MessageItem::MessageItem(bool isLeft)
:isLeft(isLeft)
{
}
MessageItem *MessageItem::makeMessageItem(bool isLeft, const Message &message)
{
// 1. 创建对象和布局管理器
MessageItem* messageItem = new MessageItem(isLeft);
QGridLayout* layout = new QGridLayout();
layout->setContentsMargins(30, 10, 40, 0);
layout->setSpacing(10);
// 这个 MessageItem 最低不能低于 100
messageItem->setMinimumHeight(100);
messageItem->setLayout(layout);
// 2. 创建头像
QPushButton* avatarBtn = new QPushButton();
avatarBtn->setFixedSize(40, 40);
avatarBtn->setIconSize(QSize(40, 40));
avatarBtn->setIcon(message.sender.avatar);
avatarBtn->setStyleSheet("QPushButton { border: none;}");
if (isLeft) {
layout->addWidget(avatarBtn, 0, 0, 2, 1, Qt::AlignTop | Qt::AlignLeft);
} else {
layout->addWidget(avatarBtn, 0, 1, 2, 1, Qt::AlignTop | Qt::AlignLeft);
}
// 3. 创建名字和时间
QLabel* nameLabel = new QLabel();
nameLabel->setText(message.sender.nickname + " | " + message.time);
nameLabel->setAlignment(Qt::AlignBottom);
nameLabel->setStyleSheet("QLabel { font-size: 12px; color: rgb(178, 178, 178); }");
if (isLeft) {
layout->addWidget(nameLabel, 0, 1);
} else {
layout->addWidget(nameLabel, 0, 0, Qt::AlignRight);
}
// 4. 创建消息体
QWidget* contentWidget = nullptr;
switch (message.messageType) {
case model::TEXT_TYPE:
contentWidget = makeTextMessageItem(isLeft, message.content);
break;
case model::IMAGE_TYPE:
contentWidget = makeImageMessageItem();
break;
case model::FILE_TYPE:
contentWidget = makeFileMessageItem();
break;
case model::SPEECH_TYPE:
contentWidget = makeSpeechMessageItem();
break;
default:
LOG() << "错误的消息类型! messageType=" << message.messageType;
}
if (isLeft) {
layout->addWidget(contentWidget, 1, 1);
} else {
layout->addWidget(contentWidget, 1, 0);
}
return messageItem;
}
QWidget *MessageItem::makeTextMessageItem(bool isLeft, const QString &content)
{
MessageContentLabel* messageContentLabel=new MessageContentLabel(content,isLeft);
return messageContentLabel;
}
QWidget *MessageItem::makeImageMessageItem()
{
MessageContentLabel* messageImageLabel = new MessageContentLabel("", true);
return messageImageLabel;
}
QWidget *MessageItem::makeFileMessageItem()
{
MessageContentLabel* messageImageLabel = new MessageContentLabel("", true);
return messageImageLabel;
}
QWidget *MessageItem::makeSpeechMessageItem()
{
MessageContentLabel* messageImageLabel = new MessageContentLabel("", true);
return messageImageLabel;
}
////////////////////////////////////////////////////////
/// 表示 "文本消息" 正文部分
////////////////////////////////////////////////////////
MessageContentLabel::MessageContentLabel(const QString &text, bool isLeft)
: isLeft(isLeft)
{
// 设置一下 SizePolicy
this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
QFont font;
font.setFamily("微软雅黑");
font.setPixelSize(16);
this->label = new QLabel(this);
this->label->setText(text);
this->label->setFont(font);
this->label->setAlignment(Qt::AlignVCenter | Qt::AlignLeft);
this->label->setWordWrap(true); // 设置文本自动换行
this->label->setStyleSheet("QLabel { padding: 0 10px; line-height: 1.2; background-color: transparent; }");
}
// 这个函数会该控件被显示的时候自动调用到.
void MessageContentLabel::paintEvent(QPaintEvent *event)
{
(void) event;
// 1. 获取到父元素的宽度
QObject* object = this->parent();
if (!object->isWidgetType()) {
// 当前这个对象的父元素不是预期的 QWidget, 此时不需要进行任何后续的绘制操作.
return;
}
QWidget* parent = dynamic_cast<QWidget*>(object);
int width = parent->width() * 0.6;
// 2. 计算当前文本, 如果是一行放置, 需要多宽.
QFontMetrics metrics(this->label->font());
int totalWidth = metrics.horizontalAdvance(this->label->text());
// 3. 计算出此处的行数是多少 (40 表示左右各有 20px 的边距)
int rows = (totalWidth / (width - 40)) + 1;
if (rows == 1) {
// 如果此时得到的行数就只有一行
width = totalWidth + 40;
}
// 4. 根据行数, 计算得到高度. (20 表示上下各有 10px 的边距)
int height = rows * (this->label->font().pixelSize() * 1.2 ) + 20;
// 5. 绘制圆角矩形和箭头
QPainter painter(this);
QPainterPath path;
// 设置 "抗锯齿"
painter.setRenderHint(QPainter::Antialiasing);
if (isLeft) {
painter.setPen(QPen(QColor(255, 255, 255)));
painter.setBrush(QColor(255, 255, 255));
// 绘制圆角矩形
painter.drawRoundedRect(10, 0, width, height, 10, 10);
// 绘制箭头
path.moveTo(10, 15);
path.lineTo(0, 20);
path.lineTo(10, 25);
path.closeSubpath(); // 绘制的线形成闭合的多边形, 才能进行使用 Brush 填充颜色.
painter.drawPath(path); // 不要忘记真正的绘制操作
this->label->setGeometry(10, 0, width, height);
} else {
painter.setPen(QPen(QColor(137, 217, 97)));
painter.setBrush(QColor(137, 217, 97));
// 圆角矩形左侧边的横坐标位置
int leftPos = this->width() - width - 10; // 10 是用来容纳 箭头 的宽度
// 圆角矩形右侧边的横坐标位置
int rightPos = this->width() - 10;
// 绘制圆角矩形
painter.drawRoundedRect(leftPos, 0, width, height, 10, 10);
// 绘制箭头
path.moveTo(rightPos, 15);
path.lineTo(rightPos + 10, 20);
path.lineTo(rightPos, 25);
path.closeSubpath();
painter.drawPath(path);
this->label->setGeometry(leftPos, 0, width, height);
}
// 6. 重新设置父元素的高度, 确保父元素足够高, 能够容纳下上述绘制的消息显示的区域
// 注意高度要涵盖之前名字和时间的 label 的高度, 以及留点冗余空间.
parent->setFixedHeight(height + 50);
}
二、信息编辑区
messageeditarea.h文件
#include <QWidget>
#include <QPushButton>
#include <QPlainTextEdit>
#include <QLabel>
#include "model/data.h"
class MessageEditArea : public QWidget
{
Q_OBJECT
public:
explicit MessageEditArea(QWidget *parent = nullptr);
void initSignalSlot();
private:
QPushButton* sendImageBtn;
QPushButton* sendFileBtn;
QPushButton* sendSpeechBtn;
QPushButton* showHistoryBtn;
QPlainTextEdit* textEdit;
QPushButton* sendTextBtn;
QLabel* tipLabel;
signals:
};
messageeditarea.cpp文件
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QScrollBar>
#include <QFileDialog>
MessageEditArea::MessageEditArea(QWidget *parent)
: QWidget{parent}
{
// 1. 设置必要的属性
this->setFixedHeight(200);
this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
// 2. 创建垂直方向的布局管理器
QVBoxLayout* vlayout = new QVBoxLayout();
vlayout->setSpacing(0);
vlayout->setContentsMargins(10, 0, 10, 10);
this->setLayout(vlayout);
// 3. 创建水平方向的布局管理器
QHBoxLayout* hlayout = new QHBoxLayout();
hlayout->setSpacing(0);
hlayout->setContentsMargins(10, 0, 0, 0);
hlayout->setAlignment(Qt::AlignLeft | Qt::AlignTop);
vlayout->addLayout(hlayout);
// 4. 把上方的四个按钮, 创建好并添加到水平布局中
QString btnStyle = "QPushButton { background-color: rgb(225, 225, 225); border: none; } QPushButton:pressed { background-color: rgb(255, 255, 255); }";
QSize btnSize(35, 35);
QSize iconSize(25, 25);
sendImageBtn = new QPushButton();
sendImageBtn->setFixedSize(btnSize);
sendImageBtn->setIconSize(iconSize);
sendImageBtn->setIcon(QIcon(":/resource/image/image.png"));
sendImageBtn->setStyleSheet(btnStyle);
hlayout->addWidget(sendImageBtn);
sendFileBtn = new QPushButton();
sendFileBtn->setFixedSize(btnSize);
sendFileBtn->setIconSize(iconSize);
sendFileBtn->setIcon(QIcon(":/resource/image/file.png"));
sendFileBtn->setStyleSheet(btnStyle);
hlayout->addWidget(sendFileBtn);
sendSpeechBtn = new QPushButton();
sendSpeechBtn->setFixedSize(btnSize);
sendSpeechBtn->setIconSize(iconSize);
sendSpeechBtn->setIcon(QIcon(":/resource/image/sound.png"));
sendSpeechBtn->setStyleSheet(btnStyle);
hlayout->addWidget(sendSpeechBtn);
showHistoryBtn = new QPushButton();
showHistoryBtn->setFixedSize(btnSize);
showHistoryBtn->setIconSize(iconSize);
showHistoryBtn->setIcon(QIcon(":/resource/image/history.png"));
showHistoryBtn->setStyleSheet(btnStyle);
hlayout->addWidget(showHistoryBtn);
// 5. 添加多行编辑框
textEdit = new QPlainTextEdit();
textEdit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
textEdit->setStyleSheet("QPlainTextEdit { border: none; background-color: transparent; font-size: 14px; padding: 10px; }");
textEdit->verticalScrollBar()->setStyleSheet("QScrollBar:vertical { width: 2px; background-color: rgb(45, 45, 45); }");
vlayout->addWidget(textEdit);
// 6. 添加提示 "录制中" 这样的 QLabel
tipLabel = new QLabel();
tipLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
tipLabel->setText("录音中...");
tipLabel->setAlignment(Qt::AlignCenter);
tipLabel->setFont(QFont("微软雅黑", 24, 600));
vlayout->addWidget(tipLabel);
tipLabel->hide();
// 7. 添加发送文本消息的按钮
sendTextBtn = new QPushButton();
sendTextBtn->setText("发送");
sendTextBtn->setFixedSize(120, 40);
QString style = "QPushButton { font-size: 16px; color: rgb(7, 193, 96); border: none; background-color: rgb(233, 233, 233); border-radius: 10px; } ";
style += "QPushButton:hover { background-color: rgb(210, 210, 210); }";
style += "QPushButton:pressed { background-color: rgb(190, 190, 190); }";
sendTextBtn->setStyleSheet(style);
vlayout->addWidget(sendTextBtn, 0, Qt::AlignRight | Qt::AlignVCenter);
// 8. 统一初始化信号槽
initSignalSlot();
}
void MessageEditArea::initSignalSlot()
{
}
三、个人信息窗口
SelfinfoWidget.h文件
#include <QDialog>
#include <QWidget>
#include <QPushButton>
#include <QLabel>
#include <QLineEdit>
#include <QGridLayout>
class SelfinfoWidget : public QDialog
{
Q_OBJECT
public:
SelfinfoWidget(QWidget* parent);
void initSingalSlot();
void clickNameSubmitBtn();
void clickDescSubmitBtn();
void clickGetVerifyCodeBtn();
void clickPhoneSubmitBtn();
void clickAvatarBtn();
private:
QGridLayout* layout;
QPushButton* avatarBtn;
QLabel* idTag; // 显示 "序号"
QLabel* idLabel; // 显示 "1234"
QLabel* nameTag; // 显示 "昵称"
QLabel* nameLabel; // 显示 "张三"
QLineEdit* nameEdit; // 编辑昵称
QPushButton* nameModifyBtn; // 修改名字
QPushButton* nameSubmitBtn; // 提交修改
QLabel* descTag; // 显示 "签名"
QLabel* descLabel; // 显示 "从今天开始认真敲代码"
QLineEdit* descEdit; // 编辑签名
QPushButton* descModifyBtn; // 修改签名
QPushButton* descSubmitBtn; // 提交修改
QLabel* phoneTag; // 显示 "电话"
QLabel* phoneLabel; // 显示 "18612345678"
QLineEdit* phoneEdit; // 编辑电话
QPushButton* phoneModifyBtn; // 修改电话
QPushButton* phoneSubmitBtn; // 提交修改
QLabel* verifyCodeTag; // 显示 "验证码"
QLineEdit* verifyCodeEdit; // 输入验证码
QPushButton* getVerifyCodeBtn; // 获取验证码按钮
// 要修改的新的手机号码
QString phoneToChange;
// 倒计时的时间
int leftTime = 30;
};
SelfinfoWidget.cpp文件
#include <QCursor>
#include <QGridLayout>
#include <QTimer>
#include <QFileDialog>
#include "debug.h"
SelfinfoWidget::SelfinfoWidget(QWidget *parent):QDialog(parent)
{
// 1. 设置整个窗口的属性
this->setFixedSize(500, 250);
this->setWindowTitle("个人信息");
this->setWindowIcon(QIcon(":/resource/image/logo.png"));
// 窗口被关闭时, 自动销毁这个对话框对象.
this->setAttribute(Qt::WA_DeleteOnClose);
// 把窗口移动到鼠标当前的位置
this->move(QCursor::pos());
// 2. 创建布局管理器
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);
// 3. 创建头像
avatarBtn = new QPushButton();
avatarBtn->setFixedSize(75, 75);
avatarBtn->setIconSize(QSize(75, 75));
avatarBtn->setStyleSheet("QPushButton { border: none; background-color: transparent; }");
layout->addWidget(avatarBtn, 0, 0, 3, 1);
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; border-radius:5px; padding-left:2px; }";
int height = 30;
// 4. 添加用户的 id 的显示
idTag = new QLabel();
idTag->setFixedSize(50, height);
idTag->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
idTag->setText("序号");
idTag->setStyleSheet(labelStyle);
idLabel = new QLabel();
idLabel->setFixedHeight(height);
idLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
// 5. 添加用户的名字的显示
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(editStyle);
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();
// 6. 添加个性签名
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::Fixed);
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(editStyle);
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);
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->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->setStyleSheet("QPushButton { border: none; background-color: transparent; } QPushButton:pressed { background-color: rgb(231, 231, 231); }");
getVerifyCodeBtn->setFixedSize(70, height);
getVerifyCodeBtn->hide();
// 9. 添加到布局管理器. 第 0 列被头像占用了. 下列内容都是从第一列开始往后排
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);
#if TEST_UI
idLabel->setText("1234");
nameLabel->setText("张三");
descLabel->setText("从今天开始认真敲代码");
phoneLabel->setText("18612345678");
avatarBtn->setIcon(QIcon(":/resource/image/defaultAvatar.png"));
#endif
// 10. 连接信号槽
initSingalSlot();
}
void SelfinfoWidget::initSingalSlot()
{
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());
});
}
void SelfinfoWidget::clickNameSubmitBtn()
{
}
void SelfinfoWidget::clickDescSubmitBtn()
{
}
void SelfinfoWidget::clickGetVerifyCodeBtn()
{
}
void SelfinfoWidget::clickPhoneSubmitBtn()
{
}
void SelfinfoWidget::clickAvatarBtn()
{
}