当前位置: 首页 > article >正文

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

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

前言

        在上一集我们已经完成了对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
}

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

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


http://www.kler.cn/a/299945.html

相关文章:

  • 洛谷刷题1-3
  • 【JAVA 基础 第(20)课】JDBC JAVA 连接 MySql 数据库
  • 编程题-两数相加(中等)
  • 【Go面试】工作经验篇 (持续整合)
  • Linux下 date时间应该与系统的 RTC(硬件时钟)同步
  • Genetic Prompt Search via Exploiting Language Model Probabilities
  • 自然语言处理系列六十九》搜索引擎项目实战》搜索框架技术选型
  • 常见 HTTP 状态码详解与Nginx 文件上传大小限制
  • C++复习day08
  • SpringCache之本地缓存
  • 自动化抢票 12306
  • 苹果iOS/ iPadOS18 RC 版、17.7 RC版更新发布
  • Mybatis-Plus笔记
  • Mac OS14外接显示器字体过小和放大字体模糊问题的简单解决
  • FIFO求和实验
  • 电脑点击关机之后,又自动重启开机了。根本就关不了?
  • 关于Python爬虫的基础知识
  • 云计算实训48——k8s环境搭建(详细版)
  • 数据结构——堆排序
  • OGRE 3D----创建第一个OGRE 3D示例
  • YashanDB产品调优实战:分享日常调优技巧及提升系统性能的实战经验
  • 【Hot100算法刷题集】双指针-01-移动零(含置零思路、移动思路、偏移量思路、冒泡法)
  • 支付环节攻击方式与漏洞类型
  • OPENAIGC开发者大赛企业组钻石奖 | AI For 3D Generation
  • RQ-RAG:提升检索增强生成模型的查询精炼能力
  • 中间件漏洞