简介
本文介绍如何实现好友申请界面, 其效果如下图所示

在此之前我们需要先定义一个ClickedOnceLabel类,支持点击一次的label功能。
接着新增一个ClickedOnceLabel类
1  | class ClickedOnceLabel : public QLabel  | 
实现
1  | ClickedOnceLabel::ClickedOnceLabel(QWidget *parent):QLabel(parent)  | 
完善ClickedLabel
我们之前实现了ClickedLabel类,接下来修改下clicked信号,使其携带参数
1  | void clicked(QString, ClickLbState);  | 
然后在其实现的鼠标释放事件的逻辑中添加
1  | void ClickedLabel::mouseReleaseEvent(QMouseEvent *event)  | 
好友申请
好友申请界面和逻辑,我们可以创建一个设计师界面类叫做ApplyFriend类,我们在类的声明中添加如下成员。
1  | class ApplyFriend : public QDialog  | 
接下来我们修改ui使其变成如下布局

然后我们逐个实现功能,构造函数分别实现信号的链接和成员初始化,析构函数回收必要的资源。
1  | ApplyFriend::ApplyFriend(QWidget *parent) :  | 
因为此时还未与服务器联调数据,此时我们写一个InitLabel的函数模拟创建多个标签展示
1  | void ApplyFriend::InitTipLbs()  | 
下面这个函数是将标签添加到展示区
1  | void ApplyFriend::AddTipLbs(ClickedLabel* lb, QPoint cur_point, QPoint& next_point, int text_width, int text_height)  | 
重写事件过滤器展示滑动条
1  | bool ApplyFriend::eventFilter(QObject *obj, QEvent *event)  | 
后期搜索用户功能用户数据会从服务器传回来,所以写了下面的接口
1  | void ApplyFriend::SetSearchInfo(std::shared_ptr<SearchInfo> si)  | 
当点击按钮,可展示更多标签的功能。
1  | void ApplyFriend::ShowMoreLabel()  | 
重排好友标签编辑栏的标签
1  | void ApplyFriend::resetLabels()  | 
添加好友标签编辑栏的标签
1  | void ApplyFriend::addLabel(QString name)  | 
点击回车后,在好友标签编辑栏添加标签,在标签展示栏添加标签
1  | void ApplyFriend::SlotLabelEnter()  | 
当我们点击好友标签编辑栏的标签的关闭按钮时会调用下面的槽函数
1  | void ApplyFriend::SlotRemoveFriendLabel(QString name)  | 
当我们点击标签展示栏的标签,可以实现标签添加和删除
1  | //点击标已有签添加或删除新联系人的标签  | 
当标签文本变化时,下面提示框的文本跟随变化
1  | void ApplyFriend::SlotLabelTextChange(const QString& text)  | 
如果编辑完成,则隐藏编辑框
1  | void ApplyFriend::SlotLabelEditFinished()  | 
点击提示框,也会添加标签,功能如下
1  | void ApplyFriend::SlotAddFirendLabelByClickTip(QString text)  | 
确认申请和取消申请只是打印了对应信息,并且回收界面
1  | void ApplyFriend::SlotApplyCancel()  | 
美化界面
添加如下qss文件美化界面
1  | #ApplyFriend{  | 
视频
https://www.bilibili.com/video/BV1ZM4m127z8/?vd_source=8be9e83424c2ed2c9b2a3ed1d01385e9