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

会话好友区设计与开发(五)

会话好友区设计与开发(五)

前言

在上一集,我们完成了选中和切换item的颜色变化的功能,那么这一集,我们将开始封装一些必要的函数。

需求

我们需要封装一些逻辑,那么我们也要进行分析。

在上一集我们虽然对选中了不同的item进行了颜色的切换,但是我们其实并没有真正的选中了不同的item对吗?所以我们需要做一个clickItem的一个函数。

在之前,我们暂时完成了会话好友区的界面,我们也知道好友列表还有好友申请列表长的也是大差不差,尽管在数据存储层面上不一样,那么我们可以基于SessionFriendItem把剩下的两个Item作为子类来实现。

既然SessionFriendItem成为了父类,我们就可以通过这个父类来创建子类,那么我们还要设计一个逻辑来判断我们添加的子类是哪一个,这个还是十分的好实现的。

clickItem

我们选中的这个Item,范围上不能含糊,不能小于0也不能超出布局的范围。

然后是否为空指针,我们不仅仅要判断这个item是否为空指针,还要判断里面的布局是否为空指针,这两种,我们都认为是元素不存在。

当然我们最后是需要强转成SessionFriendItem的,之后执行select的逻辑。

void SessionFriendArea::clickItem(int index)
{if(index < 0 || index >= container->layout()->count()){LOG() << "点击元素下标超出范围, index = " << index;return;}QLayoutItem* layoutItem = container->layout()->itemAt(index);if(layoutItem == nullptr || layoutItem->widget() == nullptr){LOG() << "指定元素不存在, index = " << index;return;}SessionFriendItem* item = dynamic_cast<SessionFriendItem*>(layoutItem->widget());//强转item->select();}

继承SessionFriendItem

既然我们要继承SessionFriendItem,我们就要设置这两个item的类来继承SessionFriendItem。不过当然既然做了父类,我们也需要把会话item也弄一个子类出来。

/*** @brief 会话item实现* @param owner* @param chatSessionId* @param avatar* @param name* @param lastMessage*/
SessionItem::SessionItem(QWidget *owner, const QString &chatSessionId, const QIcon &avatar,const QString &name, const QString &lastMessage): SessionFriendItem(owner,avatar,name,lastMessage),chatSessionId(chatSessionId)
{}
/*** @brief 好友item实现* @param owner* @param userId* @param avatar* @param name* @param description*/
FriendItem::FriendItem(QWidget *owner, const QString &userId, const QIcon &avatar,const QString &name, const QString &description):SessionFriendItem(owner,avatar,name,description),userId(userId)
{}
/*** @brief 好友申请item实现* @param owner* @param userId* @param avatar* @param name*/
ApplyItem::ApplyItem(QWidget *owner, const QString &userId, const QIcon &avatar, const QString &name): SessionFriendItem(owner,avatar,name,""),userId(userId)
{}

代码可以随便看看,我们继承SessionFriendItem的几个变量,当然,每一个变量有可能有不同,因为存储的时候也会有所不同。

通过父类添加子类

为了通过父类创建子类,我们首先就需要先引入一个枚举类型。

ItemType

/*** 滚动区域item类型*/
enum ItemType{SessionItemType,FriendItemType,ApplyItemType
};

addItem

添加item我们就需要把item的类型和对应的id添加进去。

/***  添加SessionFriendItem的子类,SeesionItem、FriendItem、ApplyItem的其中一个*/
void SessionFriendArea::addItem(ItemType itemType, const QString& id, const QIcon &avatar, const QString &name, const QString &text)
{SessionFriendItem* item = nullptr;if(itemType == SessionItemType){item = new SessionItem(this, id, avatar, name, text);}else if(itemType == FriendItemType){item = new FriendItem(this, id, avatar, name, text);}else if(itemType == ApplyItemType){item = new ApplyItem(this, id, avatar, name);}else{LOG() << "未知 ItemType! itemType=" << itemType;return;}container->layout()->addWidget(item);
}

我们到时候的item都会类似如下图

那么我们貌似也不能完全长这样,毕竟我们到时候的好友申请去的每一条item都是需要有接受和拒绝两个按钮的。那么这个功能,我们留到下一集再说。

欲知后事如何,请听下回分解!


http://www.mrgr.cn/news/48027.html

相关文章:

  • 多旋翼无人机理论 | 四旋翼动力学数学模型与Matlab仿真
  • CTFHUB-web进阶-php
  • 对计算机网络中“层”的理解
  • QT + FFMPEG实现简易播放器
  • 虚幻引擎结构之UWorld
  • tcp 的重传,流量控制,拥塞控制
  • 深圳有哪些神仙公司?
  • C++ 基于SDL库的 Visual Studio 2022 环境配置
  • 拿下奇怪的前端报错:1比特丢失导致的音视频播放时长无限增长-浅析http分片传输核心和一个坑点
  • Python编程(基础)
  • 不推荐在freertos中使用HAL_Delay() 函数
  • onnx底层入门
  • 你知道C++多少——模版进阶
  • 金九银十软件测试面试题(800道)
  • yarn install 报错 Expected version “>=18“,Got “16.20.0“
  • 数据库设计与查询分析(练习--对小白友好)
  • 【Java 22 | 2】 深入解析Java 22 :原生支持的记录类型
  • C++11 简单手撕多线程编程
  • 一个比较复杂的makefile工程例子
  • this,this指向
  • 在Stable Diffusion WebUI中安装SadTalker插件时几种错误提示的处理方法
  • 直流有刷电机驱动芯片:【TOSHIBA:TB6612】
  • Linux基础命令groupmod详解
  • 使用LlamaFactory进行模型微调
  • 低功耗
  • 多人播报配音怎么弄?简单4招分享