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