Files
MyChat_Client/sessionfriendarea.cpp
2025-05-24 12:18:28 +08:00

207 lines
6.4 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; }");
this->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
this->verticalScrollBar()->setStyleSheet(R"(
QScrollBar:vertical {
background-color: rgb(231, 231, 231); /* 滚动条背景透明 */
width: 6px; /* 默认宽度 */
margin: 0px 0px 0px 0px; /* 边距清零 */
}
QScrollBar::handle:vertical {
background: #CCCCCC; /* 滑块颜色(浅灰色) */
min-height: 30px; /* 滑块最小高度 */
border-radius: 3px; /* 圆角 */
}
QScrollBar::handle:vertical:hover {
background: #999999; /* 悬停时滑块颜色加深 */
width: 10px; /* 悬停时宽度增大 */
}
QScrollBar::handle:vertical:pressed {
background: #666666; /* 按下时颜色更深 */
}
QScrollBar::add-line:vertical,
QScrollBar::sub-line:vertical {
height: 0px; /* 隐藏上下箭头按钮 */
background: none;
}
QScrollBar::add-page:vertical,
QScrollBar::sub-page:vertical {
background: none; /* 滚动条背景区域透明 */
}
)");
//去除默认的黑边
this->setStyleSheet("border: 0px solid transparent;");
// 把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, "张三" + 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(20, 0, 0, 0);
// layout->setSpacing(0);
layout->setHorizontalSpacing(10);
layout->setVerticalSpacing(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 SessionFriendItem::paintEvent(QPaintEvent *event)
{
(void) event;
QStyleOption opt;
opt.initFrom(this);
QPainter p(this);
style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}
void SessionFriendItem::mousePressEvent(QMouseEvent *event)
{
(void) event;
select();
}
void SessionFriendItem::enterEvent(QEvent *event)
{
(void) event;
if(this->selected) {
return;
}
this->setStyleSheet("QWidget { background-color: rgb(220, 220, 220); }");
}
void SessionFriendItem::leaveEvent(QEvent *event)
{
(void) event;
if(this->selected) {
return;
}
this->setStyleSheet("QWidget { background-color: rgb(231, 231, 231); }");
}
void SessionFriendItem::select()
{
//遍历其他元素(还原背景色)
const QObjectList children = this->parentWidget()->children();
for(QObject* child : children) {
if(!child->isWidgetType()) {
continue;
}
//说明是widget 那就将child强转为SessionFriendItem
SessionFriendItem* item = dynamic_cast<SessionFriendItem*>(child);
if(item->selected) {
item->selected = false;
item->setStyleSheet("QWidget { background-color: rgb(231, 231, 231); }");
}
}
//鼠标点击时会触发这个事件
//点击时修改背景色
this->setStyleSheet("QWidget { background-color: rgb(210, 210, 210); }");
this->selected = true;
}
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);
}