#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(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); }