造轮子--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();
}


 


  • 15
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值