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

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

前言

        在上一集我们已经完成了对item的设计与开发,也详细解释了一些细节,但是我们上一集并没有对item进行显示,那么这一集我们会开发两个SessionFriendArea的方法以及使用一个宏开关进行测试。

需求

我们要先开发两个比较简单的方法,一个是添加item、一个是清空区域内所有item的方法。

最后弄一个宏开关进行测试。

addItem

既然要往container里面添加item,我们就需要把相关的头像、昵称以及预览信息作为参数传入。

并且我们想起来上一集我们的item的构造函数中,我们有一个owner的指针变量。我们就需要将this一并传入item的构造函数。

构造出来的item,我们就需要塞到container的layout当中。

所以代码就是以下简单的几句:

void SessionFriendArea::addItem(const QIcon &avatar, const QString &name, const QString &text)
{
    SessionFriendItem* item = new SessionFriendItem(this,avatar,name,text);
    container->layout()->addWidget(item);
}

就是这么的朴实无华。

clear

那么我们需要继续开发clear这个方法。

这个也是非常的简单,我们需要先获取container的layout,再遍历这个layout,一个一个的删除即可。

那么我们就很容易写出下面的代码

void SessionFriendArea::clear()
{
    QLayout* layout = container->layout();
    for(size_t i = 0; i < layout->count();i++){
        QLayoutItem* item = layout->takeAt(i);
        }
    }
}

至此我们就可以下班了对吧?

NO!!!怎么可能那么简单,踩坑了!!!

虽然说是遍历一个一个删,这整个逻辑并没有什么问题,但是删除之后,count也变小了啊!一边遍历一边删除是极其危险的事情。

一旦删除了元素,上面的count就变了,而且删除的元素的后面的元素的下标也会发生改变。

那我们应该怎么做呢?

第一种办法:每次都删除0号位!

第二种办法:从后往前删!

我选择第二种办法!

之后就写出以下方法啦!

void SessionFriendArea::clear()
{
    QLayout* layout = container->layout();
    for(size_t i = layout->count() - 1 ; i >= 0;i--){
        QLayoutItem* item = layout->takeAt(i);
        }
    }
}

这下就能下班咯!

老板:你小子年终奖没了!

size_t这种无符号整数,确定能小于0吗?最后这个代码是一个死循环了。所以我们就需要把他们改为int。

那好!我们终于下班了对吗?

好像也不对,总感觉少了什么东西。我们的item是怎么创建的?好好想想。

我们是new出来的东西,需要自己手动delete!

所以最终代码如下:

void SessionFriendArea::clear()
{
    QLayout* layout = container->layout();
    for(int i = layout->count() - 1 ; i >= 0;i--){
        QLayoutItem* item = layout->takeAt(i);
        if(item->widget()){
            //释放widget,new出来的对象需要手动delete
            delete item->widget();
        }
    }
}

终于是下班了。

TEST_UI

先别跑,别忘了我们的需求,还需要一个宏定义的测试呢。

直接看代码!!!

#if TEST_UI
    QIcon icon(":/resource/image/defaultAvatar.png");
    for(int i = 9527; i < 9557; i++){
        this->addItem(icon,"编号" + QString::number(i),"编号" + QString::number(i) + "听候你的差遣");
    }
#endif
}

这里我们就完成了以上的三个需求,我们接下来要看一眼测试结果。

可以看到我们的整个测试结果,但是长得好丑啊,好像左边的背景有点问题吧,那么这个问题我们会留到下一次来解决,今天就先讲到这里!

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值