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

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;
}

点击下载完整代码

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

相关文章:

  • 轻量化开源方案——浅析PdfPatcher实际应用
  • 在单片机中如何在断电前将数据保存至DataFlash?
  • C++:整数奇偶排序
  • [特殊字符] 使用增量同步+MQ机制将用户数据同步到Elasticsearch
  • MATLAB 2023b 配电柜温度报警系统仿真
  • 【算法】:动态规划--背包问题
  • Spring AI 源码解析:Tool Calling链路调用流程及示例
  • 夏日旅行(广度优先搜索)
  • 嵌入式软件-如何做好一份技术文档?
  • 深入理解设计模式之适配器模式
  • 《Python语言程序设计》第4章第8题3个个位数之间比大小。‘a小于b而b大于c’这是最有漏洞的一个对比,请问我如何判断a和c
  • Jenkins的Pipline中有哪些区块,以及其它知识点整理
  • 计算机网络学习(五)——TCP
  • C++ --- string
  • 全局异常处理器
  • 开篇:MCP理论理解和学习
  • 基于Python的自动化视频编辑脚本设计,能够处理视频剪辑、添加字幕、文本动画、音效和图形等功能
  • 24. 日志的基本实现方式
  • 第十天的尝试
  • Gateway全局过滤器:接口耗时统计与黑白名单配置
  • 没有做网站能备案吗/武汉seo网站排名优化
  • 网站设计做什么的/大作设计网站
  • 哪个网站做国际生意/seo快速排名软件网站
  • excel做网站链接/国家高新技术企业查询
  • 高校网站建设近期情况说明/网站搜索优化官网
  • 信用门户网站建设观摩/在线优化seo