一、Qt中的树

平时我们经常使用树的结构来组织和展示数据,比如文件系统等——

在Qt中,我们可以使用Qt提供的便捷的QTreeWidget类,利用该类的接口,轻松地将已有数据显示在树中。

除此之外,还可以使用QTreeView,设置它的数据模型,比如QStandardItemModel,我们可以根据自己需要实现更多功能,尤其是在做数据同步的时候特别方便。

二、结点的搜索

在实际的应用中,我们可能需要进行结点的搜索,也就是根据关键字过滤出匹配的项,隐藏不匹配的项。

根据我的经验,一般是在界面中树的上面放一个搜索输入框。可以根据输入内容精确匹配,也可以根据输入的首字母匹配结点中的汉字。

其实这就是一个树的遍历的问题,遍历的方式可以使用递归。

一般搜索方式有两种:精确搜索和模糊搜索。下面我分两部分说明,假设树中节点文字有汉字、英文、数字。

精确搜索

搜索框中输入汉字时使用精确搜索,我所设计的并不是严格意义上的精确搜索。

比如对于文本“东京不太热Miao”,输入“京”、“太热”、“不太热mi”等关键字都能搜到,但是如果输入“京东”那就不匹配了。

模糊搜索

模糊搜索也就是拼音搜索,输入汉字的拼音首字母就能搜到它,比如对于“东京不太热Miao”,输入“djbtr”、“btr”、“trm”、“trM”等关键字都能搜到。

我给拼音首字母搜索加了点功能,就是输入全拼时也能搜索,但必须从第一个汉字的拼音开始,比如“dongjingb”匹配,但是“jingbutaire”就不匹配了。

三、功能实现

如何区分精确搜索和模糊搜索

搜索框中的输入全部是英文字母或数字时,使用模糊搜索;否则,如果有汉字,则使用精确搜索。

搜索方式

因为树有很多级,所以需要使用递归遍历所有节点。将每个节点上的文本与你输入的关键字进行比较,如果匹配,则显示该节点、它的所有父节点、它的所有子节点,如果不匹配,继续遍历其子节点,循环往复,如果找不到匹配,则将其隐藏。

四、难点

树的搜索很简单,然而将汉字转为拼音很麻烦,虽然网上很多很多实现,但都存在缺点。很大一部分是先将汉字转为ascii,然后获得其拼音的ascii,继而得到拼音和首字母。这种方式的缺点是很多生僻字以及部分常见字搜不出来,但对于一般树的搜索已经够用了。另一种方式是穷举,将所有可能的情况都列举出来,但是这样做要列举很多很多情况,占的空间多,而且查询效率也很低。

五、程序优化

我实现树的搜索是在一位同事的基础上修改的,他是这样实现的:每次搜索框发生改变,都将之前的树清空,然后重新建立树,如果树节点中保存了一些数据,它们将会丢失,或者你需要大费周折才能将数据恢复。

我将节点的增删,修改成了节点的隐藏显示。

然后对树的搜索进行了封装,最后提供了一个静态函数static void SearchItem(QTreeWidget *, const QString &);

只需传2个参数,一个是你所需要搜索的树,另一个是搜索的关键字,就能对树进行搜索了。

不多说了,分享我所实现类的头文件部分源码——

class TreeSearch
{
public:
TreeSearch();
~TreeSearch();
static void SearchItem(QTreeWidget *, const QString &);//搜索函数 private:
static void FuzzySearch(QString &); //模糊搜索
static void FuzzySearchChildren(QTreeWidgetItem *, QString &); //模糊搜索子节点(递归)
static void PreciseSearch(const QString &); //精确搜索
static void PreciseSearchChildren(QTreeWidgetItem *, const QString &);//精确搜索子节点(递归)
static void ShowTotalItem(); //显示所有节点
static void ShowTotalChildrenItem(QTreeWidgetItem *); //显示所有子节点(递归)
static void ShowTotalParentItem(QTreeWidgetItem *); //设置所有父节点可显示(递归)
static void GetPinYin(const QString &, QString &strInitial, QString &strQuanPin); //将汉字转为拼音(首字母以及全拼)
static void GetWString(const std::string &, std::wstring &wStrOut);//将string转为wstring private:
static QTreeWidget *m_pCurTreeWidget; //当前的树
};

  

Qt——树结点的搜索的更多相关文章

  1. Qt——树的搜索

    一.Qt中的树 Qt中树的实现有两种方式.第一种是使用Qt提供的QTreeWidget,很多函数都封装好,比较方便:另一种是通过QTreeView实现,设置它的数据模型,比如使用QStandardIt ...

  2. [置顶] ※数据结构※→☆非线性结构(tree)☆============树结点 链式存储结构(tree node list)(十四)

    结点: 包括一个数据元素及若干个指向其它子树的分支:例如,A,B,C,D等. 在数据结构的图形表示中,对于数据集合中的每一个数据元素用中间标有元素值的方框表示,一般称之为数据结点,简称结点. 在C语言 ...

  3. [LeetCode] Find Bottom Left Tree Value 寻找最左下树结点的值

    Given a binary tree, find the leftmost value in the last row of the tree. Example 1: Input: 2 / \ 1 ...

  4. [HNOI2004]L语言 字典树 记忆化搜索

    [HNOI2004]L语言 字典树 记忆化搜索 给出\(n\)个字符串作为字典,询问\(m\)个字符串,求每个字符串最远能匹配(字典中的字符串)到的位置 容易想到使用字典树维护字典,然后又发现不能每步 ...

  5. Qt——树的搜索实现源码

    一.使用QTreeWidget 头文件: /************************************************************************ 树的搜索类 ...

  6. qt的资源替换搜索QDir具体解释

    QDir对跨平台的文件夹操作提供了非常多的便利,为了更加方便的提供全局资源的查找,QDir提供了搜索路径替换功能,攻克了资源搜索不便的问题,也能提高文件查找的效率. QDir通过已知的路径前缀去搜索并 ...

  7. JavaScript树(二) 二叉树搜索

    TypeScript方式实现源码 // 二叉树与二叉树搜索 class Node { key; left; right; constructor(key) { this.key = key; this ...

  8. Django 六——自定义标签、图片验证码、发送邮件、评论树、组合搜索

    1.自定义标签 2.图片验证码 3.生成邮箱验证码.发送邮件 4.评论树实现 5.组合搜索(Q) 1.自定义标签 配置: a.在app中新建文件夹  templatetags,里面新建  xx.py文 ...

  9. asp.net之treeview无法显示树结点图标(IP与域名的表现竟不一样)

    背景   今天接到客户的电话,说部署上去的项目树型的treeview无法正常显示,显示成了好几个大红叉.如: 排查   于是我通过远程登录到服务器,在本地测试了一会发现没有这个问题存在,无论是通过IP ...

随机推荐

  1. ASCII、Unicode、UTF-8编码关系

    由于计算机是美国人发明的,因此,最早只有127个字符被编码到计算机里,也就是大小写英文字母.数字和一些符号,这个编码表被称为ASCII编码,比如大写字母A的编码是65,小写字母z的编码是122.但是要 ...

  2. XSS--PHPwind5.3复现

    xss再分析 短payload <svg/onload=alert(1)> <body/onfocus=alert``> <body/onfocus=confirm``& ...

  3. JDK11安装后,环境变量的坑

    安装了最新的JDK11,安装完后设置环境变量,打开CMD,没生效 检查了3遍,都没发现问题,在PATH中将JAVA设置移到第一也不行 最后偶然发现,在点击如图右下的‘编辑文本’,用文本方式编辑时,发现 ...

  4. HTTP基本定义

    一.网络的简单定义: 1.http:是www服务器传输超文本向本地浏览器的传输协议.(应用层) 2.IP:是计算机之间相互识别通信的机制.(网络层) 3.TCP:是应用层通信之间通信.(传输层) IP ...

  5. jdk从1.8换成1.7后,查看版本还是1.8解决方法

    因学习需要,需将jdk从1.8更改到1.7,其中遇到了些小麻烦,如果你也遇到这种麻烦,可以借鉴一下我的解决方法. 1.jdk的安装及环境变量的配置,详见https://jingyan.baidu.co ...

  6. Lua学习笔记(1): HelloWorld和数据类型

    Lua是一个轻量级的脚本语言,由c语言编写,容易嵌入到应用中,深受游戏开发者的青睐 环境安装 选用SciTE作为lua的IDE 可以在github找到这个开源的软件 SciTE下载链接 安装好之后打开 ...

  7. java 实现redis缓存

    由于项目加载时请求数据量过大,造成页面加载很慢.采用redis作缓存,使二次访问时页面,直接取redis缓存. 1.redis连接参数 2.连接redis,设置库 3.配置文件开启缓存 4.mappe ...

  8. 【循环控制器】-(针对中间部分要循环的场景,相当于loadrunner的action部分)

    一般使用 setup线程组 + teardown组 针对中间要循环的部分   使用循环处理器    单独循环中间的部分,相当于loadrunner的action部分

  9. ubuntu 18.04 LTS server系统安装失败问题解决

    准备自己搭一个服务器,USB引导盘的方式安装ubutun系统. 中途遇到两个问题,导致耗时比较久,记录如下. 问题一: installing system阶段卡主 具体描述: 配置镜像源地址以后,进入 ...

  10. LeetCode 102 ——二叉树的层次遍历

    1. 题目 2. 解答 定义一个存放树中数据的向量 data,一个存放树的每一层数据的向量 level_data 和一个存放每一层节点的队列 node_queue. 如果根节点非空,根节点进队,然后循 ...