选择好友窗口(四)
前言
在上一集我们在末尾就说了要完成一个点击左侧列表的元素的复选框能够添加到右侧列表上的功能以及删除的功能,那么我们这一集就要做好这两个功能。
需求分析
首先第一个功能,点击左侧列表的元素的复选框能够添加到右侧列表,说清楚点就是点击左侧未被勾选的元素,让其在右边的列表上出现一条一模一样的元素。我们都知道点击的是我们的复选框,那么我们的复选框就是要触发信号槽的一个关键所在。
那么第二个功能也是和我们的复选框触发信号槽有关,那么我们破局的关键就是这个复选框是否被选中,但是!我们的右侧区域怎么才能和左侧区域产生一个微妙的联系呢?我们可以很快就能想到,每一条元素都会有一个唯一的标识,也就是我们的userId,这个是永远不会变的,这就是为什么我们上一集会发现函数里面会多出一个参数的原因。不过说实话,修改了函数的签名确实会很麻烦,可能每个函数都联系着很多关联的函数,修改起来超级麻烦的。
连接信号槽
如果点击之后是勾选了的,就添加到右侧选择区,如果是取消勾选,就把右侧的踢出去!并且要让点击左侧和右侧都能够完成。
connect(checkBox, &QCheckBox::toggled, this,[=](bool checked){if(checked){//勾选了,添加到右侧选择区owner->addSelectedFriend(userId, avatar, name);}else{//取消勾选owner->deleteSelectedFriend(userId);}});
那么我们就需要完成这两个关键的函数了。
addSelectedFriend
这个无需多言,就是创建一个新的item,直接放到selectedContainer的layout里面即可
void ChooseFriendDialog::addSelectedFriend(const QString& userId, const QIcon &avatar, const QString &name)
{ChooseFriendItem* item = new ChooseFriendItem(this, userId, avatar, name, true);selectedContainer->layout()->addWidget(item);
}
deleteSelectedFriend
这个会比较复杂,请耐心看完。
void ChooseFriendDialog::deleteSelectedFriend(const QString &userId)
{//遍历QVBoxLayout* vlayout = dynamic_cast<QVBoxLayout*>(selectedContainer->layout());//从后往前for(int i = vlayout->count() - 1; i >= 0; --i){auto* item = vlayout->itemAt(i);if(item == nullptr || item->widget() == nullptr){continue;}ChooseFriendItem* chooseFriendItem = dynamic_cast<ChooseFriendItem*>(item->widget());//判定当前的item的userIdif(chooseFriendItem->getUserId() != userId){continue;}vlayout->removeWidget(chooseFriendItem);//释放内存!!!//delete chooseFriendItem 不可以用chooseFriendItem->deleteLater();}//遍历左侧的列表,取消掉勾选状态QVBoxLayout* vlayoutLeft = dynamic_cast<QVBoxLayout*>(totalContainer->layout());for(int i = 0; i < vlayoutLeft->count(); ++i){auto* item = vlayoutLeft->itemAt(i);if(item == nullptr || item->widget() == nullptr){continue;}ChooseFriendItem* chooseFriendItem = dynamic_cast<ChooseFriendItem*>(item->widget());if(chooseFriendItem->getUserId() != userId){continue;}//取消选中状态chooseFriendItem->getCheckBox()->setChecked(false);}
}
我们这个把右侧这个item踢出去总共是两个大步骤,第一就是从右侧的列表当中给他踢出去,第二个步骤就是要把左侧的item的复选框取消掉选中的状态。
这里有一个很重要的逻辑就是要延迟delete我们要删除的对象。当我们在点击右侧复选框进行删除选中的好友的时候,我们的复选框是被触发信号槽的功能的,我们直接使用 delete
会导致信号槽连接在对象销毁后被调用,所以我们不能这么干,要延迟delete这个对象,很重要!!!
那么这个选择好友窗口就完成了,那么我们就要开始考虑群聊的详细窗口了,欲知后事如何,请听下回分解。