首页 > 其他分享 >如何使用QCompleter和QLineEdit实现支持模糊匹配的搜索栏

如何使用QCompleter和QLineEdit实现支持模糊匹配的搜索栏

时间:2024-07-17 13:54:13浏览次数:7  
标签:__ 匹配 parent self source QLineEdit QCompleter model def

最近需要用Qt实现搜索栏,类似于浏览器的搜索栏,需要支持模糊搜索并实时显示匹配的选项。

接下任务后,迅速入门Qt. 本来准备魔改QComboBox,但始终处理不好用户输入的焦点,最终效果并不好。后来了解到,QLineEdit中支持QCompleterQCompleter就是用来实现补全提示的。

QCompleter支持行内补全、弹出窗口补全等多种模式;并提供了前缀匹配和子串匹配两种匹配模式,但很可惜,这两种基本的匹配模式都不是我需要的。

 

所谓模糊匹配,还要支持缩写(例如“中国”对应于“中华人民共和国”),因此需要额外实现QCompleter. 为QLineEdit设置QCompleter后,每当输入栏的文本发生变化,QCompletersplitPath方法就会被调用,其原型为:

splitPath(self, path:str) -> list[str]

其中,参数path就是输入栏中的字符串。接下来,需要在一个待选的字符串列表中选择所有匹配项,在Qt中,字符串列表可以保存于最简单的QStrignListModel中。

 

那么如何从字符串列表中筛选出匹配项呢?还需要引入一个代理类,这个类继承自QSortFilterProxyModel. 将上述QStringListModel传给它后,它会对每一项调用filterAcceptsRow方法,此方法的返回值是bool类型,表示是否接受这一项。

class FuzzyFilterProxyModel(QSortFilterProxyModel):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.split_path = ''

    def SetSplitPath(self, split_path):
        """保存输入栏中的字符串, 在filterAcceptsRow检查是否模糊匹配时会用到"""
        self.split_path = split_path

    def filterAcceptsRow(self, source_row:int, source_parent) -> bool:
        index = self.sourceModel().index(source_row, 0, source_parent)
        word = self.sourceModel().data(index)

        # 检查是否模糊匹配
        for ch in self.split_path:
            if ch not in word:
                return False
        return True

提示

文中代码基于PySide6实现,使用PyQt或是C++的Qt差别不大。另外,在PySide6中,自带的类方法首字母为小写,由本人自定义的类方法首字母为大写,请注意区分。

以上代码重载了filterAcceptsRow方法,在其中实现了简单的模糊匹配功能。此外,定义了方法SetSplitPath, 用于保存输入栏的文本。

 

有了这个类,就可以自定义QCompleter了:

class FuzzyCompleter(QCompleter):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.source_model = QStringListModel([])

    def splitPath(self, path: str) -> List[str]:
        proxy_model = FuzzyFilterProxyModel()
        proxy_model.SetSplitPath(path)
        proxy_model.setSourceModel(self.source_model)
        self.setModel(proxy_model)
        return []

    def SetSourceModel(self, source_model):
        self.source_model = source_model

注释

或许你会好奇,为什么在splitPath中每次都需要实例化一个FuzzyFilterProxyModel,而不将其保存为类的成员。我自己也觉得不必如此,但如果不重新设置模型,搜索提示功能无法正常工作。(做完这个就跑路,不管那么多了

标签:__,匹配,parent,self,source,QLineEdit,QCompleter,model,def
From: https://www.cnblogs.com/overxus/p/18307099

相关文章

  • 力扣第十题——正则表达式匹配(动态规划化的运用)(附思路讲解、完整代码及知识点精炼)
    题目介绍给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配。'.' 匹配任意单个字符'*' 匹配零个或多个前面的那一个元素所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。 示例1:输入:s="aa",p="a"输出:false解......
  • OpenCV开发笔记(七十八):在ubuntu上搭建opencv+python开发环境以及匹配识别Demo
    若该文为原创文章,转载请注明原文出处本文章博客地址:https://hpzwl.blog.csdn.net/article/details/140435870长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…OpenCV开发专栏......
  • 由于安装多个jdk导致出现java以及javac版本不匹配问题
    之前由于下载了多个版本的jdk版本,导致了在运行java程序时出现了报错thisversionoftheJavaRuntimeonlyrecognizesclassfileversionsupto52.0报错信息大概为版本不匹配,查看了java以及javac的版本,发现一个是18,一个是20,所以查看解决方法,实现版本匹配一开始全在修改环......
  • 机器学习策略篇:详解处理数据不匹配问题(Addressing data mismatch)
    处理数据不匹配问题如果您的训练集来自和开发测试集不同的分布,如果错误分析显示有一个数据不匹配的问题该怎么办?这个问题没有完全系统的解决方案,但可以看看一些可以尝试的事情。如果发现有严重的数据不匹配问题,通常会亲自做错误分析,尝试了解训练集和开发测试集的具体差异。技术上......
  • opencv中 在特征点匹配代码举例,以及queryIdx和trainIdx的用法
    一、用法在特征点匹配中,queryIdx和trainIdx是匹配对中的两个索引,用于指示匹配点在不同图像或特征向量中的位置。1.假设我们有两幅图像A和B,并使用特征点提取算法(如SIFT)从它们中提取出特征点和对应的描述子。2.在进行特征点匹配时,我们得到了一个匹配对,其中包含了两个特征点:特征点A......
  • 24暑假算法刷题 | Day9 | LeetCode 151. 反转字符串中的单词,28. 找出字符串中第一个匹
    目录151.反转字符串中的单词题目描述题解28.找出字符串中第一个匹配项的下标题目描述题解459.重复的子字符串题目描述题解卡码网55.右旋字符串题目描述题解151.反转字符串中的单词点此跳转题目链接题目描述给你一个字符串s,请你反转字符串中单词的顺......
  • Linux 中 grep命令仅仅输出匹配的字符串
     001、[root@PC1test]#lsa.txt[root@PC1test]#cata.txt##测试数据aa33aa77bbaaaa22aakkccbbddaauu883388rrqq[root@PC1test]#grep-oP"aa"a.txt##输出仅仅匹配的内容,但是换行了aaaaaaaaaaaa[root@PC1test]......
  • 面试前:各方面都匹配 面试后:恐怕是凉了
    很多人在浏览简历信息时觉得自己的条件很符合某家公司的要求,但一到面试环节却屡屡碰壁。看看下面这些问题,有没有你遇到过的?下面是一位朋友分享了面经,为了帮助大家更好地准备面试,今天发出来和大家分享一下来自粉丝的面经投稿。是QQ面试哦,值得一看,接下来,我们将一起探讨如何准备面......
  • MySQL入门学习-深入索引.全值匹配
        在MySQL中,索引的全值匹配是指在查询中使用索引列的所有部分进行精确匹配。当查询条件中的列值与索引中的值完全匹配时,MySQL可以使用索引来快速定位和检索数据,从而提高查询性能。    以下是关于全值匹配的一些详细信息:一、概念:  -全值匹配是指在查......
  • ysyx: 指令规则的匹配
    dummy的反汇编表:80000000<_start>:80000000:00000413lis0,080000004:00009117auipcsp,0x980000008:ffc10113addisp,sp,-4#80009000<_end>8000000c:00c000ef......