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

发布于:2025-05-25 ⋅ 阅读:(23) ⋅ 点赞:(0)
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;
}

点击下载完整代码

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


网站公告

今日签到

点亮在社区的每一天
去签到