当前位置: 首页 > article >正文

消息展示区(一)

消息展示区(一)

前言

在上一集,我们做了主窗口的右窗口的初始化工作,这一集我们将开始完成右窗口的消息展示区。

需求分析

首先我们要先去初始化右窗口的消息展示区,这个窗口是需要滚动的,所以我们会和中间窗口的实现的方式类似。我们需要先让这个MessageShowArea继承QScrollArea,里面放入一个widget。

消息展示区的每一条信息,我们也要封装成一个类,由于我们需要分辨并正确放置每一条信息,我们需要用一个布尔变量isLeft来判定这条信息是否放置在左边,放置在右边的就是我们自己发送的信息。这个还是很好理解的。我们在创建MessageItem实例的时候需要用到工厂模式,需要四种消息类型的一种,这里暂时只做文本类型。

MessageShowArea

和中间区域一样的操作,先初始化基本属性并设置滚动条的样式,我们创建一个名为container的widget作为包含内部元素的容器,之后再在container里面设置一个垂直的布局管理器。

MessageShowArea::MessageShowArea() {
    //初始化基本属性
    this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    this->setWidgetResizable(true);

    //设置滚动条样式
    this->verticalScrollBar()->setStyleSheet("QScrollBar:vertical { width:2px; background-color: rgb(240,240,240); }");
    this->horizontalScrollBar()->setStyleSheet("QScrollBar:horizontal { height: 0; }");
    this->setStyleSheet("QScrollArea { border: none; }");

    //创建container这样的widget,作为包含内部元素的容器
    container = new QWidget();
    this->setWidget(container);

    //container里添加布局管理器
    QVBoxLayout* layout = new QVBoxLayout();
    layout->setSpacing(0);
    layout->setContentsMargins(0,0,0,0);
    container->setLayout(layout);


}

makeMessageItem

每一条消息包含了发送者的昵称、头像、发送的消息三大类,当然也可以包括每条信息的时间。我们这里只讲一点点。

首先我们要创建MessageItem的对象和它的布局管理器,我们将用网格布局进行布局。我们需要从Message中获取发送者的头像。

我们在Message当中其实是没有发送者的头像的,但是有一个用户信息的对象,里面存放着发送者的头像。

MessageShowArea::MessageItem MessageShowArea::MessageItem::makeMessageItem(bool isLeft, const Message &message)
{
    //创建对象和布局管理器
    MessageItem* messageItem = new MessageItem(isLeft);
    QGridLayout* layout = new QGridLayout();

    layout->setContentsMargins(0,0,0,0);
    layout->setSpacing(0);

    messageItem->setMinimumHeight(100);
    messageItem->setLayout(layout);

    //创建头像
    QPushButton* avatarBtn = new QPushButton();
    avatarBtn->setFixedSize(40,40);
    avatarBtn->setIconSize(QSize(40,40));
    avatarBtn->setIcon(message.sender.avatar);
    if(isLeft){
        layout->addWidget(avatarBtn,0,0,2,1,Qt::AlignTop | Qt::AlignLeft);
    } else{
        layout->addWidget(avatarBtn,0,1,2,1,Qt::AlignTop | Qt::AlignLeft);
    }


    return messageItem;
}

那么我们这一集就先到这里。


http://www.kler.cn/news/355252.html

相关文章:

  • Spring Boot知识管理系统:数据驱动的决策
  • 2.2024.10.18
  • MySQL InnoDB Buffer Pool空间不足导致查询变慢
  • YOLO11改进|注意力机制篇|引入轴向注意力Axial Attention
  • 10.18学习
  • [Linux] 创建可以免密登录的SFTP用户
  • 单片机常见的存储器
  • Tomcat的下载安装与使用
  • Ubuntu 22.04静态IP的修改
  • 2024最新R语言结构方程模型(SEM)在生态学领域中的实践应用
  • 微信小程序UI自动化测试实践(Minium+PageObject)
  • css的思考
  • 《PyTorch深度学习快速入门教程》学习笔记(第16周)
  • 550,游戏玩法分析四
  • Lumerical学习——优化和参数扫描(Optimization and parameter sweeps)
  • LeetCode:1884. 鸡蛋掉落-两枚鸡蛋(dp Java)
  • Java面经--JVM篇
  • 【存储设备专栏 2.2 -- linux 下 fdisk -l 命令详细介绍2 】
  • 【计算机网络】IPv4地址的表示方法
  • Nest.js 实战 (十四):如何获取客户端真实 IP