Qt——树结点的搜索
一、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——树结点的搜索的更多相关文章
- Qt——树的搜索
一.Qt中的树 Qt中树的实现有两种方式.第一种是使用Qt提供的QTreeWidget,很多函数都封装好,比较方便:另一种是通过QTreeView实现,设置它的数据模型,比如使用QStandardIt ...
- [置顶] ※数据结构※→☆非线性结构(tree)☆============树结点 链式存储结构(tree node list)(十四)
结点: 包括一个数据元素及若干个指向其它子树的分支:例如,A,B,C,D等. 在数据结构的图形表示中,对于数据集合中的每一个数据元素用中间标有元素值的方框表示,一般称之为数据结点,简称结点. 在C语言 ...
- [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 ...
- [HNOI2004]L语言 字典树 记忆化搜索
[HNOI2004]L语言 字典树 记忆化搜索 给出\(n\)个字符串作为字典,询问\(m\)个字符串,求每个字符串最远能匹配(字典中的字符串)到的位置 容易想到使用字典树维护字典,然后又发现不能每步 ...
- Qt——树的搜索实现源码
一.使用QTreeWidget 头文件: /************************************************************************ 树的搜索类 ...
- qt的资源替换搜索QDir具体解释
QDir对跨平台的文件夹操作提供了非常多的便利,为了更加方便的提供全局资源的查找,QDir提供了搜索路径替换功能,攻克了资源搜索不便的问题,也能提高文件查找的效率. QDir通过已知的路径前缀去搜索并 ...
- JavaScript树(二) 二叉树搜索
TypeScript方式实现源码 // 二叉树与二叉树搜索 class Node { key; left; right; constructor(key) { this.key = key; this ...
- Django 六——自定义标签、图片验证码、发送邮件、评论树、组合搜索
1.自定义标签 2.图片验证码 3.生成邮箱验证码.发送邮件 4.评论树实现 5.组合搜索(Q) 1.自定义标签 配置: a.在app中新建文件夹 templatetags,里面新建 xx.py文 ...
- asp.net之treeview无法显示树结点图标(IP与域名的表现竟不一样)
背景 今天接到客户的电话,说部署上去的项目树型的treeview无法正常显示,显示成了好几个大红叉.如: 排查 于是我通过远程登录到服务器,在本地测试了一会发现没有这个问题存在,无论是通过IP ...
随机推荐
- day 2 飞机大战原理
1. 程序的图片的坐标 (左上角为顶点) 2.图片变成动态的 3.集成显卡 和独立显卡
- 3551: [ONTAK2010]Peaks加强版
3551: [ONTAK2010]Peaks加强版 https://www.lydsy.com/JudgeOnline/problem.php?id=3551 分析: kruskal重构树 + 倍增 ...
- Java >>>运算符 和 >> 运算符
>>> 在java 表示有符号右移.什么意思呢?就是最高位符号位也会移动. 我们知道,>>表示有符号右移. -1>> 1 = -1 -1>>2 = ...
- productFlavors 差异打包问题
差异化打包: 1.dependencies compile 是不可以放到差异化的productFlavors里面的. 会报错: Error:(69, 0) Could not find method ...
- spring-boot日志操作
SpringBoot Logback日志配置 Logback的配置介绍: 1.Logger.appender及layout Logger作为日志的记录器,把它关联到应用的对应的context上后,主要 ...
- package.json中的devDependencies和dependencies有啥区别?
如果你的项目是发布到npm的一个包, 那么这个包的package.json中的dependencies中的依赖是会被下载下来到这个包的node_modules文件夹中的(如果你的项目本身没有这个依赖) ...
- SpriteKit手机游戏摇杆JoyStick的使用 -- by iFIERO游戏开发教程
### 工欲善其事,必先利其器 有时候学习如何应用第三方库是非常重要的,因为我们不用再自己重复造轮子,在这里,我们就把原先利用重力感应来操控飞机改为用游戏摇杆joystick来操控,具体的操作如下:` ...
- Java开发工程师(Web方向) - 04.Spring框架 - 第5章.Web框架
第5章--Web框架 Web框架概述 Web框架单元测验 本次得分为:13.50/15.00, 本次测试的提交时间为:2017-09-25 1单选(2分) 关于Spring MVC中Dispatche ...
- TW实习日记:第26天
这周组长休年假去了,并且之前主要负责的项目也已经上线了,可以说没那么忙了,手头就一个协助别的组做的移动端项目.可是这个项目特别坑,由于网端是9年前的项目,导致后台的接口有非常多的问题,并且入参多得令人 ...
- 洛谷 P1781 宇宙总统:sort(string)
题目描述 地球历公元6036年,全宇宙准备竞选一个最贤能的人当总统,共有n个非凡拔尖的人竞选总统,现在票数已经统计完毕,请你算出谁能够当上总统. 输入输出格式 输入格式: 第一行为一个整数n,代表竞选 ...