QT的QTreeWidget实现搜索框的效果

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QT的QTreeWidget实现搜索框的效果相关的知识,希望对你有一定的参考价值。

参考技术A 开发环境:win10、QT5.9

开发工具:vs2019

1、根据搜索框的内容匹配下面的索引,找到则显示该字段及该字段的上下索引;

2、当找不到该内容则全都不显示;

3、部分字段匹配搜索,输入的字段与索引项存在部分匹配的时候则同样会显示该索引项及其父子索引项;

1、实现该界面

    该界面包括一个QLineEdit控件和一个QTreeWidget控件。

2、使用递归实现对查找到的项的父子索引项遍历且设置为可见

//使用递归的方式向目标节点的父节点进行递归查找

void TableWidgwet::showParent(QTreeWidgetItem* pItem)



    if (pItem != nullptr)    //判断当前节点是否存在

   

        QTreeWidgetItem* pTreeParentItem = pItem->parent(); //获取当前节点的父节点

        if (pTreeParentItem != nullptr)  //判断父节点是否存在

        

            pTreeParentItem->setHidden(false);  //将该父级索引项设置为显示

            showParent(pTreeParentItem);//直接传入处理过的节点

           //避免传入该节点后递归后跳转到祖父节点

        

   



//使用递归的方式遍历子节点同时设置为显示

void TableWidgwet::showSon(QTreeWidgetItem* pItem)



    int iChild = pItem->childCount();  //获取该子节点的数目

    for (int i = 0; i < iChild; ++i)//遍历当前项的子节点并设置

   

        pItem->child(i)->setHidden(false);

        showSon(pItem->child(i));//对当前 子项进行递归

   



3、对当前的节点进行遍历查找且对遍历的节点进行显示和隐藏的设置

//依旧是采用递归的方式实现

void TableWidgwet::searchItem(QTreeWidgetItem* tableItem,QString& strText)



    if (tableItem != nullptr)//防止野指针的问题

   

        for (int i = 0; i < tableItem->childCount(); ++i)

       

            QTreeWidgetItem* pTreeItem = tableItem->child(i);

            if (pTreeItem != nullptr)

           

              //如何索引项字段部分匹配于输入框字段则设置该项及其父子项显示且展开

                if (pTreeItem->text(0).contains(strText))

               

                    pTreeItem->setHidden(false);

                    pTreeItem->setExpanded(true);

                    showSon(pTreeItem);

                    showParent(pTreeItem);

               

                else

               

                    pTreeItem->setHidden(true);//不匹配则隐藏

                    searchItem(pTreeItem, strText);//递归遍历

               

           

       

   



4、对整个树形索引控件的一级索引项进行遍历,并调用上述的函数实现对每个一级索引项下的索引项进行递归遍历设置

void TableWidgwet::showItem()



    for (int i = 0; i < ui.treeWidget->topLevelItemCount(); ++i)

    

            if (ui.treeWidget->topLevelItem(i)->text(0).contains(ui.lineEdit->text()))

           

                ui.treeWidget->topLevelItem(i)->setHidden(false);

           

        else

           

                ui.treeWidget->topLevelItem(i)->setHidden(true);

           

        searchItem(ui.treeWidget->topLevelItem(i), ui.lineEdit->text());

    



5、使用connect对QLineEdit的textchange事件响应与槽函数绑定处理

        connect(ui.lineEdit, &QLineEdit::textChanged, this, &TableWidgwet::showItem);

以上是关于QT的QTreeWidget实现搜索框的效果的主要内容,如果未能解决你的问题,请参考以下文章

Qt QTreeWidget 树形结构实现(转)

QT 基础Qt中实现树形结构可以使用QTreeWidget类

Qt QTreeWidget节点的添加+双击响应+删除详解(转)

Qt入门系列开发教程高级控件篇QTreeWidget树形小部件

QT5 QtreeWidget 实现点击item事件以及右键菜单删除item 和 重命名item

关于qt中的QTreeWidget的拖放问题