造轮子-QTreeWidget节点之精确搜索
目录
造轮子–QTreeWidget节点之精确搜索
由于项目需要对QTreeWidget树节点进行搜索,所以就做了一个精确搜索树节点文本的轮子。
搜索基本说明
(搜索说明引用自 ):
一般搜索方式有两种:精确搜索和模糊搜索。下面我分两部分说明,假设树中节点文字有汉字、英文、数字。
–>精确搜索
搜索框中输入汉字时使用精确搜索,我所设计的并不是严格意义上的精确搜索。比如对于文本“东京不太热Miao”,输入“京”、“太热”、“不太热mi”等关键字都能搜到,但是如果输入“京东”那就不匹配了。
–>模糊搜索
模糊搜索也就是拼音搜索,输入汉字的拼音首字母就能搜到它,比如对于“东京不太热Miao”,输入“djbtr”、“btr”、“trm”、“trM”等关键字都能搜到。我给拼音首字母搜索加了点功能,就是输入全拼时也能搜索,但必须从第一个汉字的拼音开始,比如“dongjingb”匹配,但是“jingbutaire”就不匹配了。
- 轮子界面展示
图 1
图 2
- 轮子功能说明
1.中英文及数字查找
2.查找节点路径展示
3.背景颜色标记
- 轮子代码构思说明
第一步:首先轮子应该记录初始状态树的背景色,在构造函数中记录该值。
第二步:用户向文本框中输入关键词后,点击回车或点击搜索按钮,轮子将循环查询查询树节点名称与输入文本匹配情况。由于文本编辑完成与点击搜索按钮处理的事情一样,故二者触发的是同一个槽函数。
第三步:槽函数的编写:为了提高轮子的健壮性,我们首先需要做两个判断。第一,判断输入文本是否为空;第二,当前树是否为空;同时还需要做两个前期初始处理。第一,将背景色恢复成初始色(此处理代码中与设置背景色一起处理了);第二,收缩树节点。 槽函数中接下来要做的是就是遍历树节点,与当前文本进行对比。来进行背景色的设置及父节点的展开。
- 轮子源码共享
**实现代码:
头文件**
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QTreeWidget> #include <QBrush> #include <QDebug> namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = 0); ~Widget(); void searchChild(QTreeWidgetItem *cItem, const QString &txt); void parentExpand(QTreeWidgetItem *item); private slots: void on_pushButton_clicked(); void on_lineEdit_editingFinished(); private: Ui::Widget *ui; QBrush m_itemBrush; }; #endif // WIDGET_H
. cpp文件
#include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); m_itemBrush = ui->treeWidget->topLevelItem(0)->background(0); } Widget::~Widget() { delete ui; } void Widget::searchChild(QTreeWidgetItem *cItem, const QString &txt) { int childCount = cItem->childCount(); for (int i = 0; i < childCount; ++i) { QTreeWidgetItem *item = cItem->child(i); if (-1 != item->text(0).indexOf(txt)) { item->setExpanded(true); item->setBackground(0,Qt::green); parentExpand(item); } else { item->setBackground(0, m_itemBrush); } searchChild(item, txt); } } void Widget::parentExpand(QTreeWidgetItem *item) { if (item->parent() != NULL) { QTreeWidgetItem *pItem = item->parent(); if (! pItem->isExpanded()) { pItem->setExpanded(true); } parentExpand(pItem); } } void Widget::on_pushButton_clicked() { ui->treeWidget->collapseAll(); QString txt = ui->lineEdit->text(); bool isEmptyTxt = txt.isEmpty(); bool isEmptyTree = ui->treeWidget->topLevelItemCount(); //非零个为true if (isEmptyTxt) { QTreeWidgetItemIterator it(ui->treeWidget); while(*it) { (*it)->setBackground(0, m_itemBrush); it++; } return; } if ( ! isEmptyTree) { return; } #if 0 int count = ui->treeWidget->topLevelItemCount(); for (int i =0; i < count; ++i) { QTreeWidgetItem *cItem = ui->treeWidget->topLevelItem(i); if (-1 != cItem->text(0).indexOf(txt)) { cItem->setBackground(0,Qt::green); } else { cItem->setBackground(0, m_itemBrush); } searchChild(cItem, txt); } #else QTreeWidgetItemIterator it(ui->treeWidget); while(*it) { QString str = (*it)->text(0); if (-1 != str.indexOf(txt)) { QTreeWidgetItem *pItem = (*it)->parent(); if (pItem != NULL) { bool isExpanded = pItem->isExpanded(); if (! isExpanded){ ui->treeWidget->expandItem(pItem); } } (*it)->setBackground(0,Qt::green); parentExpand(*it); } else{ (*it)->setBackground(0, m_itemBrush); } it++; } #endif } void Widget::on_lineEdit_editingFinished() { on_pushButton_clicked(); }
main文件
#include "widget.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; w.show(); return a.exec(); }