#include "mainwidget.h" #include "./ui_mainwidget.h" #include #include #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); ///////////////////////////////////// // 点击自己的头像,弹出对话框显示个人的主页 ///////////////////////////////////// connect(userAvatar, &QPushButton::clicked, this, [=]()->void { SelfInfoWidget* selfInfoWidget = new SelfInfoWidget(this); selfInfoWidget->setStyleSheet("QDialog { background-color: rgb(255, 255, 255); }"); selfInfoWidget->exec(); //弹出模态对话框 //selfInfoWidget->show(); //弹出非模态对加框 }); } 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 }