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

Qt实战:自定义QTreeWidget搜索隐藏显示项功能 | 附完整源码

1、目的

通过继承QTreeWidget自定义搜索隐藏显示项的功能

2、效果

在这里插入图片描述

3、方法

通过使用setItemHidden函数来使项隐藏和显示,只需遍历整个treeWidget,来搜索全部项。

4、源码
a、头文件
#ifndef SEARCHDISPLAYTREEWIDGET_H
#define SEARCHDISPLAYTREEWIDGET_H#include <QLineEdit>
#include <QTreeWidget>class SearchDisplayTreeWidget : public QTreeWidget {public:SearchDisplayTreeWidget(QWidget *parent = 0);~SearchDisplayTreeWidget();void searchText(const QString &text);private:/*** @brief foreachSearchchildItem* @param searchLower  搜索字符串* @param isAncestorFind 父项或祖先项是否有搜索字符串,有的话子项就不能隐藏* @param parentItem 父项目* @return 所有是否有搜索到字符串*/bool foreachSearchchildItem(const QString &searchLower,const bool &isAncestorFind,QTreeWidgetItem *parentItem);
};#endif  // SEARCHDISPLAYTREEWIDGET_H
b、源文件
#include "searchdisplaytreewidget.h"
SearchDisplayTreeWidget::SearchDisplayTreeWidget(QWidget* parent): QTreeWidget(parent) {}SearchDisplayTreeWidget::~SearchDisplayTreeWidget() {}void SearchDisplayTreeWidget::searchText(const QString& text) {QString searchLower = text.toLower();for (int i = 0; i < this->topLevelItemCount(); i++) {QTreeWidgetItem* item = this->topLevelItem(i);bool isFind = false;for (int j = 0; j < this->columnCount(); j++) {QString textLower = item->text(j).toLower();isFind = textLower.contains(searchLower);if (isFind) break;}bool isFindChild = foreachSearchchildItem(searchLower, isFind, item);if (isFind || isFindChild) {if (isFindChild && !searchLower.isEmpty()) {// 是在子项找到的,展开子项this->setItemExpanded(item, true);} else {this->setItemExpanded(item, false);}this->setItemHidden(item, false);} else {this->setItemHidden(item, true);}}
}bool SearchDisplayTreeWidget::foreachSearchchildItem(const QString& searchLower, const bool& isAncestorFind,QTreeWidgetItem* parentItem) {if (!parentItem) return false;bool retFind = false;for (int i = 0; i < parentItem->childCount(); i++) {QTreeWidgetItem* item = parentItem->child(i);bool isFind = false;for (int j = 0; j < this->columnCount(); j++) {QString textLower = item->text(j).toLower();isFind = textLower.contains(searchLower);if (isFind) break;}bool isFindChild =foreachSearchchildItem(searchLower, isAncestorFind || isFind, item);if (isAncestorFind || isFind || isFindChild) {if (isFindChild && !searchLower.isEmpty()) {// 是在子项找到的,展开子项this->setItemExpanded(item, true);} else {this->setItemExpanded(item, false);}this->setItemHidden(item, false);if (isFind || isFindChild) retFind = retFind || true;} else {this->setItemHidden(item, true);retFind = retFind || false;}}return retFind;
}

点击下载完整代码

对你有用就点个赞👍,以后需要用到就收藏⭐

http://www.xdnf.cn/news/8686.html

相关文章:

  • 基于音频Transformer与动作单元的多模态情绪识别算法设计与实现(在RAVDESS数据集上的应用)
  • 算法、算力、数据哪个更重要
  • C#核心概念解析:析构函数、readonly与this关键字
  • java 代码查重(五)比较余弦算法、Jaccard相似度、欧式距离、编辑距离等在计算相似度的差异
  • 开发者工具箱-鸿蒙大小写转换开发笔记
  • H3C-WAF-单机部署
  • 【每天一个知识点】“数字人”(Digital Human)
  • Easy Dataset数据集构建使用
  • 解析 Flask 上下文机制:请求上下文、应用上下文
  • AI Agent开发第74课-解构AI伪需求的魔幻现实主义
  • 【c++】成员函数被声明为 `const` 时
  • Oracle 的SHRINK 操作实现原理
  • 软考学习中
  • Docker Swarm配置
  • Linux系统基础——是什么、适用在哪里、如何选
  • 模拟电子技术基础----绪论
  • Python 训练营打卡 Day 34
  • 前端流行框架Vue3教程:24.动态组件
  • vue3使用七牛云上传文件
  • MATLAB例程——基于分批运输与最近邻优化的垃圾运输路径规划,n个垃圾收集点,每点有固定垃圾量,车辆从处理厂出发收集垃圾后返回,目标是最小化总行驶距离
  • 洛谷B2144 阿克曼(Ackermann)函数
  • 互联网和以太网之是什么与区别
  • 2025年安克创新Anker社招校招入职测评 | 3天备考、自适应能力cata测评北森题库、安克创造者启航试炼、安克AI能力测评能力测评历年真题
  • Python协同过滤算法:从原理到实战应用
  • 数据库6——综合实验-水果商店进阶一
  • C++题解(33)2025年顺德区中小学生程序设计展示活动(初中组C++)U560876 美丽数(一)和 U560878 美丽数(二)题解
  • 优启通添加自定义浏览器及EXLOAD使用技巧分享
  • 安全语音通信系统python
  • MSP430通用按键代码(KEY)设计与实现
  • 鸿蒙UI开发——Builder函数的封装