会话好友区设计与开发(五)
会话好友区设计与开发(五)
前言
在上一集,我们完成了选中和切换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都是需要有接受和拒绝两个按钮的。那么这个功能,我们留到下一集再说。
欲知后事如何,请听下回分解!