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;
}
点击下载完整代码
对你有用就点个赞👍,以后需要用到就收藏⭐