一、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. 北京Uber优步司机奖励政策(10月26日~11月1日)

    用户组:优步北京人民优步A组(适用于10月26日-11月1日) 滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/ ...

  2. 西安Uber优步司机奖励政策(8月10日到8月16日)

    1) 工作日(周一到周五)早高峰时间段(7点到9:30点).晚高峰时间段(5点到8点)车费 2.0 倍,每单奖励部分上限35元 例:在高峰时段中,假设行程基本车费为¥15,只要达到奖励前提,最后你将获 ...

  3. Python:numpy中的tile函数

    在学习机器学习实教程时,实现KNN算法的代码中用到了numpy的tile函数,因此对该函数进行了一番学习: tile函数位于python模块 numpy.lib.shape_base中,他的功能是重复 ...

  4. PHP用url传递数组

    数组传递这么写:   echo "<a href=2.php?info=".base64_encode(serialize($information))." > ...

  5. 一个只有十行的精简MVVM框架

    本文来自网易云社区. 前言 MVVM模式相信做前端的人都不陌生,去网上搜MVVM,会出现一大堆关于MVVM模式的博文,但是这些博文大多都只是用图片和文字来进行抽象的概念讲解,对于刚接触MVVM模式的新 ...

  6. 第一篇 HTML基础

    浏览网页,就是上网,上网的本质就是下载内容. 浏览器是个解释器,用来执行HTML.css.JS代码的. HTML,CSS, JavaScript 号称网络三剑客. 1. 浏览器发送一个域名给服务端 2 ...

  7. Java开发工程师(Web方向) - 01.Java Web开发入门 - 第6章.蜂巢

    第6章--蜂巢 蜂巢简介 网站开发完,就需要测试.部署.在服务器上运行. 网易蜂巢: 采用Docker容器化技术的云计算平台 https://c.163.com 容器管理:容器可被视作为云主机的服务器 ...

  8. [译] JavaScript核心指南(JavaScript Core) 【转】

    本文转自:http://remember2015.info/blog/?p=141#scope-chain 零.索引 对象(An Object) 原型链(A Prototype Chain) 构造函数 ...

  9. 技本功丨知否知否,Redux源码竟如此意味深长(上集)

    夫 子 说 元月二号欠下袋鼠云技术公号一篇关于Redux源码解读的文章,转眼月底,期间常被“债主”上门催债.由于年底项目工期比较紧,于是债务就这样被利滚利.但是好在这段时间有点闲暇,于是赶紧把这篇文章 ...

  10. 应用Response.Write实现带有进度条的多文件上传

    前几天,写过一篇随笔“使用RESPONSE.WRITE实现在页面的生命周期中前后台的交互”.说是交互,实际上也主要是在ASP.NET的页面周期中 从后台利用RESPONSE.WRITE向前台即时的推送 ...