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

【QT】如何在遍历QTreeWidgetItem的子项过程中正确删除子项

目录

      • 1、遍历QTreeWidgetItem子项的方法
      • 2、遍历过程中删除子项
        • 2.2 正向遍历移除
        • 2.3 反向遍历移除


1、遍历QTreeWidgetItem子项的方法

  遍历QTreeWidgetItem的子项,最直接的方法就是使用QTreeWidgetItem的以下两个函数:

//返回子项数。
int QTreeWidgetItem::childCount() const;

//返回指定索引的子项。子项的索引从0开始。
QTreeWidgetItem *QTreeWidgetItem::child(int index) const;

示例如下:

for (int i = 0; i < parentItem->childCount(); i++) {
    QTreeWidgetItem* childItem = parentItem->child(i);
    qDebug()<<childItem->text(0);
}

2、遍历过程中删除子项

  删除QTreeWidgetItem的子项可以使用以下函数:

/*
 * 移除指定索引的子项。
 * 注:使用该函数,子项只是从QTreeWidgetItem的子项列表里移出,
 *     子项本身并没有释放,所以最后往往还要delete一下。
 */
QTreeWidgetItem *QTreeWidgetItem::takeChild(int index);

  在遍历QTreeWidgetItem子项过程中删除子项需要注意的就以下两点:

  • 在删除子项后,QTreeWidgetItem的子项总数发生了变化。
  • 在删除子项后,下一个子项的索引的索引可能发生遍历。

常用的遍历QTreeWidgetItem移除的方式有两种:正向遍历移除、反向遍历移除。

2.2 正向遍历移除

  从第一个子项开始,依次向后遍历并判断是否移除。由于移除操作可能会影响后续子项的索引,需要小心处理索引的变化。示例如下:

void removeItemsForward(QTreeWidgetItem* parentItem, const QString& targetText) {
    int childCount = parentItem->childCount();
    // 从第一个子项开始遍历
    for (int i = 0; i < childCount; ++i) {
        QTreeWidgetItem* childItem = parentItem->child(i);
        // 判断当前子项的文本是否与目标文本匹配
        if (childItem->text(0) == targetText) {
            // 找到匹配的节点,从父节点中移除
            delete parentItem->takeChild(i);
            // 由于移除了一个子项,需要将索引减1,避免漏判
            --i;
            // 更新子项数量,因为已经移除了一个子项
            childCount = parentItem->childCount();
        }
    }
}
2.3 反向遍历移除

  从最后一个子项开始,向前遍历并判断是否移除。这样可以避免正向遍历中移除子项后索引变化带来的复杂处理,因为移除后面的子项不会影响前面子项的索引。

void removeItemsBackward(QTreeWidgetItem* parentItem, const QString& targetText) {
    // 从最后一个子项开始遍历
    for (int i = parentItem->childCount() - 1; i >= 0; --i) {
        QTreeWidgetItem* childItem = parentItem->child(i);
        // 判断当前子项的文本是否与目标文本匹配
        if (childItem->text(0) == targetText) {
            // 找到匹配的节点,从父节点中移除
            delete parentItem->takeChild(i);
        }
    }
}
原文地址:https://blog.csdn.net/yanzhyan/article/details/145054368
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/505477.html

相关文章:

  • C语言练习(29)
  • Spring MVC 综合案例
  • 设计模式-建造者模式、原型模式
  • ORA-04031 错误
  • Django ORM解决Oracle表多主键的问题
  • mybatis(112/134)
  • 电动汽车V2G技术Matlab/Simulink仿真模型
  • 为什么Hugging Face下载的模型中没有tokenizer.model文件?
  • 【Go】:深入解析 Go 1.24:新特性、改进与最佳实践
  • 使用 TiDB 的几个优秀 Tips
  • 【2024年华为OD机试】(C卷,100分)- 字符串筛选排序 (Java JS PythonC/C++)
  • 网络分析仪测试S参数
  • 网络协议基础--协议分层
  • Java学习教程,从入门到精通,JDBC驱动程序类型及语法知识点(91)
  • 可以用于分割字符串的方法(python)
  • Mock 单元测试详细
  • 11-天猫订单数据分析
  • 深度剖析底层原理:CPU缓存一致性的奥秘
  • 机器学习-归一化
  • 低代码独特架构带来的编译难点及多线程解决方案
  • 【2025 Rust学习 --- 16 集合:Rust的STL】
  • go-echo学习笔记
  • 【Qt】01-了解QT
  • T-SQL编程
  • Python3 函数
  • 网安-HTML