Files
MyChat_Client/mainwidget.cpp
2025-05-26 20:00:33 +08:00

284 lines
9.1 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 "sessionfriendarea.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(900);
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; 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);
QPushButton* 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()
{
/////////////////////////////////////
//连接信号槽,处理标签页切换
/////////////////////////////////////
connect(sessionTabBtn, &QPushButton::clicked, this, &MainWidget::switchTabToSession);
connect(friendTabBtn, &QPushButton::clicked, this, &MainWidget::switchTabToFriend);
connect(applyTabBtn, &QPushButton::clicked, this, &MainWidget::switchTabToApply);
}
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
}