Files
MyChat_Client/mainwidget.cpp
2025-06-10 20:17:39 +08:00

346 lines
11 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "mainwidget.h"
#include "./ui_mainwidget.h"
#include <QHBoxLayout>
#include <QVBoxLayout>
#include "sessiondetailwidget.h"
MainWidget *MainWidget::instance = nullptr;
MainWidget *MainWidget::getInstance()
{
if(instance == nullptr) {
//此处不传入参数,以桌面为父窗口
//
instance = new MainWidget();
}
return instance;
}
MainWidget::MainWidget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::MainWidget)
{
ui->setupUi(this);
// this->setStyleSheet("MainWidget {min-height: 6000px; }");
this->resize(QSize(1280, 800));
this->setWindowTitle("MyChat");
this->setWindowIcon(QIcon(":/resource/image/logo.png"));
//初始化主窗口的样式布局
initMainWindow();
//初始化左侧窗口的样式布局
initLeftWindow();
//初始化中间窗口的样式布局
initMidWindow();
//初始化右侧窗口的样式布局
initRightWindow();
//初始化信号槽
initSignalSlot();
}
MainWidget::~MainWidget()
{
delete ui;
}
void MainWidget::initMainWindow()
{
QHBoxLayout* layout = new QHBoxLayout();
//layout内部的元素间隔设置为0
layout->setSpacing(0);
//layout内部元素四个方向边界的距离设置
layout->setContentsMargins(0, 0, 0, 0);
this->setLayout(layout);
windowLeft = new QWidget();
windowMid = new QWidget();
windowRight = new QWidget();
windowLeft->setFixedWidth(70);
windowMid->setFixedWidth(320);
windowRight->setMinimumWidth(600);
windowLeft->setStyleSheet("QWidget { background-color: rgb(46, 46, 46); }");
windowMid->setStyleSheet("QWidget { background-color: rgb(247, 247, 247); }");
windowRight->setStyleSheet("QWidget { background-color: rgb(245, 245, 245); }");
layout->addWidget(windowLeft);
layout->addWidget(windowMid);
layout->addWidget(windowRight);
}
void MainWidget::initLeftWindow()
{
QVBoxLayout* layout = new QVBoxLayout();
layout->setSpacing(20);
layout->setContentsMargins(0, 50, 0, 0);
windowLeft->setLayout(layout);
//添加用户头像
userAvatar = new QPushButton();
userAvatar->setFixedSize(45, 45);
userAvatar->setIconSize(QSize(45, 45));
userAvatar->setIcon(QIcon(":/resource/image/defaultAv.png"));
userAvatar->setStyleSheet("QPushButton {background-color: transparent; }");
layout->addWidget(userAvatar, 1, Qt::AlignTop | Qt::AlignCenter);
//添加会话标签页按钮
sessionTabBtn = new QPushButton();
sessionTabBtn->setFixedSize(45, 45);
sessionTabBtn->setIconSize(QSize(35, 35));
sessionTabBtn->setIcon(QIcon(":/resource/image/session_active.png"));
sessionTabBtn->setStyleSheet("QPushButton {background-color: transparent; }");
layout->addWidget(sessionTabBtn, 1, Qt::AlignTop | Qt::AlignCenter);
//添加好友标签页按钮
friendTabBtn = new QPushButton();
friendTabBtn->setFixedSize(45, 45);
friendTabBtn->setIconSize(QSize(35, 35));
friendTabBtn->setIcon(QIcon(":/resource/image/friend_inactive.png"));
friendTabBtn->setStyleSheet("QPushButton {background-color: transparent; }");
layout->addWidget(friendTabBtn, 1, Qt::AlignTop | Qt::AlignCenter);
//添加好友申请标签页按钮
applyTabBtn = new QPushButton();
applyTabBtn->setFixedSize(45, 45);
applyTabBtn->setIconSize(QSize(35, 35));
applyTabBtn->setIcon(QIcon(":/resource/image/apply_inactive.png"));
applyTabBtn->setStyleSheet("QPushButton {background-color: transparent; }");
layout->addWidget(applyTabBtn, 1, Qt::AlignTop | Qt::AlignCenter);
layout->addStretch(20);
}
void MainWidget::initMidWindow()
{
QGridLayout* layout = new QGridLayout();
//距离上方有20px另外的三个方向都不要边距
layout->setContentsMargins(0, 20, 0, 0);
layout->setSpacing(0);
windowMid->setLayout(layout);
searchEdit = new QLineEdit();
searchEdit->setFixedHeight(30);
searchEdit->setPlaceholderText("搜索");
searchEdit->setStyleSheet("QLineEdit { border-radius: 5px; color: rgb(129, 129, 129); background-color: rgb(226, 226, 226); padding-left: 5px; }");
addFriendBtn = new QPushButton();
addFriendBtn->setFixedSize(30, 30);
addFriendBtn->setIcon(QIcon(":/resource/image/cross.png"));
QString style = R"(QPushButton { border-radius: 5px; background-color: rgb(226, 226, 226); }
QPushButton::pressed { background-color: rgb(240, 240, 240); })";
addFriendBtn->setStyleSheet(style);
SessionFriendArea* sessionFriendArea = new SessionFriendArea();
//为了更加灵活的控制边距,只影响搜索框和按钮的这一行,
//创建空白的widget填充到布局管理器上
QWidget* spacer1 = new QWidget();
spacer1->setFixedWidth(10);
QWidget* spacer2 = new QWidget();
spacer2->setFixedWidth(10);
QWidget* spacer3 = new QWidget();
spacer3->setFixedWidth(10);
QWidget* spacer4 = new QWidget();
spacer4->setFixedHeight(10);
layout->addWidget(spacer1, 0, 0);
layout->addWidget(searchEdit, 0, 1);
layout->addWidget(spacer2, 0, 2);
layout->addWidget(addFriendBtn, 0 ,3);
layout->addWidget(spacer3, 0, 4);
layout->addWidget(spacer4, 1, 0, 1, 5);
layout->addWidget(sessionFriendArea, 2, 0, 1, 5);
}
void MainWidget::initRightWindow()
{
//创建右侧窗口的布局管理器
QVBoxLayout* vlayout = new QVBoxLayout();
vlayout->setSpacing(0);
vlayout->setContentsMargins(0, 0, 0, 0);
vlayout->setAlignment(Qt::AlignTop);
windowRight->setLayout(vlayout);
//创建上方的标题栏
QWidget* titleWidget = new QWidget();
titleWidget->setFixedHeight(62);
titleWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
titleWidget->setObjectName("titleWidget");
titleWidget->setStyleSheet(R"(#titleWidget { border-bottom: 2px solid rgb(231, 231, 231);
border-left: 1px solid rgb(231, 231, 231); }
)");
vlayout->addWidget(titleWidget);
//给标题栏添加 label 和 button
QHBoxLayout* hlayout = new QHBoxLayout();
hlayout->setSpacing(0);
hlayout->setContentsMargins(10, 0, 10, 0);
titleWidget->setLayout(hlayout);
QLabel* sessionTitleLabel = new QLabel();
sessionTitleLabel->setStyleSheet("QLabel { font-size: 22px; border-bottom: 1px solid rgb(230, 230, 230); }");
#if TEST_UI
//为了测试仅填充从服务器获取的数据
sessionTitleLabel->setText("TEST TITLE");
#endif
hlayout->addWidget(sessionTitleLabel);
extraBtn = new QPushButton();
extraBtn->setFixedSize(30, 30);
extraBtn->setIconSize(QSize(30, 30));
extraBtn->setIcon(QIcon(":/resource/image/more.png"));
extraBtn->setStyleSheet(R"(QPushButton { border: none; background-color: transparent; }
QPushButton:pressed { background-color: rgb(210, 210 ,210); }
)");
hlayout->addWidget(extraBtn);
//添加消息展示区
messageShowArea = new MessageShowArea();
vlayout->addWidget(messageShowArea);
//添加消息编辑区
messageEditArea = new MessageEditArea();
//确保消息编辑区处于窗口正下方
vlayout->addWidget(messageEditArea, 0, Qt::AlignBottom);
}
void MainWidget::initSignalSlot()
{
model::DataCenter* dataCenter = model::DataCenter::getInstance();
/////////////////////////////////////
//连接信号槽,处理标签页切换
/////////////////////////////////////
connect(sessionTabBtn, &QPushButton::clicked, this, &MainWidget::switchTabToSession);
connect(friendTabBtn, &QPushButton::clicked, this, &MainWidget::switchTabToFriend);
connect(applyTabBtn, &QPushButton::clicked, this, &MainWidget::switchTabToApply);
/////////////////////////////////////
// 点击自己的头像,弹出对话框显示个人的主页
/////////////////////////////////////
connect(userAvatar, &QPushButton::clicked, this, [=]()->void {
SelfInfoWidget* selfInfoWidget = new SelfInfoWidget(this);
selfInfoWidget->setStyleSheet("QDialog { background-color: rgb(245, 245, 245); }");
selfInfoWidget->exec(); //弹出模态对话框
//selfInfoWidget->show(); //弹出非模态对加框
});
/////////////////////////////////////
// 点击右上角的更多按钮,扩展会话的详细信息
/////////////////////////////////////
connect(extraBtn, &QPushButton::clicked, this, [=]() {
//判定当前的会话是单聊还是群聊
#if TEST_GROUP_SESSION_DETAIL
bool isSingleChat = false; //要根据当前选中的实际的会话来确定
#else
bool isSingleChat = true; //要根据当前选中的实际的会话来确定
#endif
if (isSingleChat) {
//说明是单聊
SessionDetailWidget* sessionDetailWidget = new SessionDetailWidget(this);
sessionDetailWidget->exec();
}
else {
//说明是群聊
GroupSessionDetailWidget* groupSessionDetailWidget = new GroupSessionDetailWidget(this);
groupSessionDetailWidget->exec();
}
});
/////////////////////////////////////
// 点击添加好友按钮,弹出添加好友的窗口
/////////////////////////////////////
connect(addFriendBtn, &QPushButton::clicked, this, [=]() {
AddFriendDialog* addFriendDialog = new AddFriendDialog(this);
addFriendDialog->exec();
});
/////////////////////////////////////
// 修改搜索框内容,设置到新弹出的输入框里面
/////////////////////////////////////
connect(searchEdit, &QLineEdit::textEdited, this, [=]() {
const QString& searchKey = searchEdit->text();
AddFriendDialog* addFriendDialog = new AddFriendDialog(this);
addFriendDialog->setSearchKey(searchKey);
searchEdit->setText("");
addFriendDialog->exec();
});
/////////////////////////////////////
// 获取个人的信息
/////////////////////////////////////
//dataCenter
}
void MainWidget::switchTabToSession()
{
//记录当前切换到了哪个标签页
activeTab = SESSION_LIST;
//调整图标显示情况
sessionTabBtn->setIcon(QIcon(":/resource/image/session_active.png"));
friendTabBtn->setIcon(QIcon(":/resource/image/friend_inactive.png"));
applyTabBtn->setIcon(QIcon(":/resource/image/apply_inactive.png"));
// 在主窗口的中间部分,加载出会话列表数据
this->loadSessionList();
}
void MainWidget::switchTabToFriend()
{
//记录当前切换到了哪个标签页
activeTab = FRIEND_LIST;
//调整图标显示情况
sessionTabBtn->setIcon(QIcon(":/resource/image/session_inactive.png"));
friendTabBtn->setIcon(QIcon(":/resource/image/friend_active.png"));
applyTabBtn->setIcon(QIcon(":/resource/image/apply_inactive.png"));
// 在主窗口的中间部分,加载出会话列表数据
this->loadFriendList();
}
void MainWidget::switchTabToApply()
{
//记录当前切换到了哪个标签页
activeTab = APPLY_LIST;
//调整图标显示情况
sessionTabBtn->setIcon(QIcon(":/resource/image/session_inactive.png"));
friendTabBtn->setIcon(QIcon(":/resource/image/friend_inactive.png"));
applyTabBtn->setIcon(QIcon(":/resource/image/apply_active.png"));
// 在主窗口的中间部分,加载出会话列表数据
this->loadApplyList();
}
//加载会话列表
void MainWidget::loadSessionList()
{
//TODO
}
//加载好友列表
void MainWidget::loadFriendList()
{
//TODO
}
//加载申请列表
void MainWidget::loadApplyList()
{
//TODO
}