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——树的搜索实现源码
一.使用QTreeWidget 头文件: /************************************************************************ 树的搜索类 ...
- Qt——树结点的搜索
一.Qt中的树 平时我们经常使用树的结构来组织和展示数据,比如文件系统等—— 在Qt中,我们可以使用Qt提供的便捷的QTreeWidget类,利用该类的接口,轻松地将已有数据显示在树中. 除此之外,还 ...
- JPA,EclipseLink 缓存机制学习(一) 树节点搜索问题引发的思考
最近在项目在使用JPA+EclipseLink 的方式进行开发,其中EclipseLink使用版本为2.5.1.遇到一些缓存方面使用不当造成的问题,从本篇开始逐步学习EclipseLink的缓存机制. ...
- Qt之自定义搜索框
简述 关于搜索框,大家都经常接触.例如:浏览器搜索.Windows资源管理器搜索等. 当然,这些对于Qt实现来说毫无压力,只要思路清晰,分分钟搞定. 方案一:调用QLineEdit现有接口 void ...
- 【Qt】Qt之自定义搜索框【转】
简述 关于搜索框,大家都经常接触.例如:浏览器搜索.Windows资源管理器搜索等. 当然,这些对于Qt实现来说毫无压力,只要思路清晰,分分钟搞定. 简述 效果 细节分析 Coding 源码下载 效果 ...
- JPA,EclipseLink 缓存机制学习——树节点搜索问题引发的思考
最近在项目在使用JPA+EclipseLink 的方式进行开发,其中EclipseLink使用版本为2.5.1.遇到一些缓存方面使用不当造成的问题,从本篇开始逐步学习EclipseLink的缓存机制. ...
- Qt之自定义搜索框——QLineEdit里增加一个Layout,还不影响正常输入文字(好像是一种比较通吃的方法)
简述 关于搜索框,大家都经常接触.例如:浏览器搜索.Windows资源管理器搜索等. 当然,这些对于Qt实现来说毫无压力,只要思路清晰,分分钟搞定. 方案一:调用QLineEdit现有接口 void ...
- 使用requests爬取梨视频、bilibili视频、汽车之家,bs4遍历文档树、搜索文档树,css选择器
今日内容概要 使用requests爬取梨视频 requests+bs4爬取汽车之家 bs4遍历文档树 bs4搜索文档树 css选择器 内容详细 1.使用requests爬取梨视频 # 模拟发送http ...
- qt自己定义搜索框(超简单,带效果图)
1. 什么也不要说.先上效果图: 2. 代码 头文件: #ifndef APPSEARCHLINE_H #define APPSEARCHLINE_H #include <QLineEdit&g ...
随机推荐
- IOS 网络浅析-(十 NSURLSession下载简介)
之前本来打算在写两个篇幅,但是在这片开写的时候觉得还是写一个比较好,有利于理解.NSURLSession下载是通过NSURLSession下载代理实现的,上一片也介绍了代理,之所以没有介绍下载是因为, ...
- iOS开发Facebook POP动效库使用教程
如果说Origami这款动效原型工具是Facebook Paper的幕后功臣,那么POP便是Origami的地基.感谢Facebook开源了POP动效库,让人人都能制作出华丽的动效.我们只需5步,便能 ...
- iOS开发--隐藏(去除)导航栏底部横线
iOS开发大部分情况下会使用到导航栏,由于我司的app导航栏需要与下面紧挨着的窗口颜色一致,导航栏底部的横线就会影响这个美观,LZ使用了以下方法.觉得不错,分享来给小伙伴们. 1)声明UIImageV ...
- C语言-04-函数
函数 函数是一组一起执行任务的语句,函数是一个可执行C程序必不可少的条件(至少一个main()函数),函数的定义形式 returnType functionName() { bodyOf of the ...
- wireshark安装
原文链接地址:http://blog.csdn.net/holandstone/article/details/47026213 Wireshark下载地址:https://www.wireshark ...
- 史上最全的MSSQL复习笔记 (转连接)
http://www.cnblogs.com/gameworld/p/4790881.html
- C# listview 拖动节点
/// <summary> /// 当拖动某项时触发 /// </summary> /// <param name="sender"></ ...
- MFC中添加用户自定义消息
1.定义一个宏(用户自定义消息从WM_USER开始) #define WM_XXXXX WM_USER+数值 2.声明一个成员函数并实现 afx_msg LRESULT OnXXXXX( WPARAM ...
- 使用cxf构建webservice
一.简介 cxf是apache下的一个开源的,功能齐全的WebService框架.是由Celtix和XFire两个开源框架组合而成.cxf可以帮助我们使用前端编程模型构建和开发服务,如JAX- WS和 ...
- hibernate一对一关系实现
按照主键映射,按照外键映射 Address.hbm.xml: <?xml version="1.0"?><!DOCTYPE hibernate-mapping P ...