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