Files
MyChat_Client/sessionfriendarea.cpp
2025-05-23 20:25:45 +08:00

111 lines
3.7 KiB
C++

#include "sessionfriendarea.h"
#include "debug.h"
#include "model/data.h"
SessionFriendArea::SessionFriendArea(QWidget *parent)
: QScrollArea {parent}
{
//设置必要属性
//设置这个才能有滚动效果
this->setWidgetResizable(true);
//设置滚动条相关样式
this->verticalScrollBar()->setStyleSheet("QScrollBar:vertical { width: 2px; background-color: rgb(46, 46, 46); }");
this->horizontalScrollBar()->setStyleSheet("QScrollBar:horizontal { height: 0px; }");
// 把widget创建出来
container = new QWidget();
container->setFixedWidth(310);
this->setWidget(container);
//给这个widget添加布局管理器方便后续添加元素进去
QVBoxLayout* layout = new QVBoxLayout();
layout->setContentsMargins(0, 0, 0, 0);
layout->setSpacing(0);
layout->setAlignment(Qt::AlignTop);
container->setLayout(layout);
// //简单测试一下滚动的效果(just for testing...)
// for(int i = 0; i < 50; i++) {
// QPushButton* btn = new QPushButton();
// QString Sbtn = "button: " + QString::number(i);
// btn->setText(Sbtn);
// layout->addWidget(btn);
// }
//构造一些临时数据作为界面调试的依据
#if TEST_UI
QIcon icon(":/resource/image/defaultAv.png");
for(int i = 0; i < 30; i++) {
this->addItem(icon, "xyz" + QString::number(i), "test: last message..." + QString::number(i));
}
// LOG() << "hello world!";
#endif
}
SessionFriendItem::SessionFriendItem(QWidget* owner, const QIcon& avatar, const QString& name, const QString& text)
:owner(owner)
{
this->setFixedHeight(70);
this->setStyleSheet("QWidget { background-color: rgb(231, 231, 231); }");
//创建网格布局管理器
QGridLayout* layout = new QGridLayout();
layout->setContentsMargins(0, 0, 0, 0);
layout->setSpacing(0);
this->setLayout(layout);
//创建头像
QPushButton* avatarBtn = new QPushButton();
avatarBtn->setFixedSize(50, 50);
avatarBtn->setIconSize(QSize(50, 50));
avatarBtn->setIcon(avatar);
avatarBtn->setStyleSheet("QPushButton {border: none;} ");
avatarBtn->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
//创建名字
QLabel* nameLabel = new QLabel();
nameLabel->setText(name);
nameLabel->setStyleSheet("QLabel { font-size: 18px; fontweight: 600; }");
nameLabel->setFixedHeight(35);
nameLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
//创建消息预览的label
QLabel* messageLabel = new QLabel();
messageLabel->setText(text);
messageLabel->setStyleSheet("QLabel { font-size: 18px; fontweight: 600; }");
messageLabel->setFixedHeight(35);
messageLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
layout->addWidget(avatarBtn, 0, 0, 2, 2);
layout->addWidget(nameLabel, 0, 2, 1, 1);
layout->addWidget(messageLabel, 1, 2, 1, 1);
}
void SessionFriendArea::clear()
{
QLayout* layout = container->layout();
//遍历布局管理器中的所有元素,依次从布局管理器中删除
for(int i = layout->count() - 1; i >= 0; i--) {
//takeAt就能够移除对应下标的元素,但还需要释放对象
QLayoutItem* item = layout->takeAt(i);
//进行释放
if(item->widget()) {
//把这个移除内容的widget进行释放
delete item->widget();
}
}
}
void SessionFriendArea::addItem(const QIcon &avatar, const QString &name, const QString &text)
{
//构造一个Item
SessionFriendItem* Item = new SessionFriendItem(this, avatar, name, text);
//将Item添加到container中
container->layout()->addWidget(Item);
}