首页 > 其他分享 >pyqt5-文本框搜索功能

pyqt5-文本框搜索功能

时间:2023-05-01 16:22:06浏览次数:36  
标签:index search self list pyqt5 window 搜索 文本框 result

1、介绍

作用是对一个文本框组件的文本进行搜索,将搜索结果在文本框中进行字体颜色标记,允许re或者普通文本搜索,支持上一个或下一个的跳转,支持标签显示当前索引和总个数。

2、ui

3、代码

(1)自定义search.py,其中包含两个重要的函数

"""
搜索算法
返回结果是list,元素是二元list,表示各搜索组的起止索引。比如[[2,15], [20,33]]
"""
import re


def search_fun(s: str, pattern: str, re_flag: bool = False):
    """search_fun(s, pattern, re_flag) -> list"""
    result = list()
    i = 0
    while i < len(s):
        if re_flag:
            r = re.search(pattern=pattern, string=s[i:])
            if r is not None:
                result.append([i + r.start(), i + r.end()])
                i = i + r.end()
            else:
                break
        else:
            if pattern in s[i:]:
                start = s.index(pattern, i)
                i = start + len(pattern)
                result.append([start, i])
            else:
                break
    return result


# print(search_fun('abcdefg', 'de', True))

"""
为搜索结果标记颜色
search_result即search_fun函数的结果
"""


def search_asAppendHtml(s: str, search_result: list, color: str = 'red'):
    """search_asAppendHtml(s, search, color) -> str"""
    last_end = 0
    result = ''
    for i in range(len(search_result)):
        s1 = s[last_end:search_result[i][0]]
        s2 = s[search_result[i][0]: search_result[i][1]]
        # pre避免连续空白符被转为单个空格字符,s1也需要包含
        result = '%s%s<span style=color:%s>%s</span>' % (result, s1, color, s2)
        # 最后一组搜索,那么其之后的字符串也需要拼接
        if i == len(search_result) - 1:
            s1 = s[search_result[i][1]:]
            result = '%s%s' % (result, s1)
    # 没有搜索结果
    if result == '':
        result = s
    # 统一的pre
    result = '<pre>%s</pre>' % result
    return result

(2)分析

有两个思路,一是必须需要按钮点击才进行搜索,而这样的话,在搜索条件变化时就必须对搜索结果清空。但这样操作相对繁琐。

二是当搜索条件发生变化时,自动触发搜索方法。需要注意的是,可能频繁触发搜索,可以考虑通过记录触发时间,当在一定时间内无新触发才直接执行,或者进行交换监视下一个触发。

暂时,优先考虑方案二。

# 搜索结果
    self.search_index_list = list()
    # 索引,显示最小为1
    self.search_index_this = 0
    self.window.pushButton: QPushButton
    self.window.pushButton.clicked.connect(self.search)
    # self.window.plainTextEdit: QPlainTextEdit
    # self.window.plainTextEdit.textChanged.connect(self.search)
    # self.window.lineEdit: QLineEdit
    # self.window.lineEdit.textChanged.connect(self.search)
    # self.window.checkBox: QCheckBox
    # self.window.checkBox.clicked.connect(self.search)
    self.window.pushButton_2: QPushButton
    self.window.pushButton_3: QPushButton
    self.window.pushButton_2.clicked.connect(self.search_pre)
    self.window.pushButton_3.clicked.connect(self.search_next)
    # 标志,为True表示可以开始搜索。为False表示此时正在搜索中,引起的事件导致搜索不执行
    self.search_flag = True

def search(self, x=None):
    if not self.search_flag:
        return
    self.search_flag = False
    self.window.plainTextEdit: QPlainTextEdit
    s = self.window.plainTextEdit.toPlainText()
    if s == '' or self.window.lineEdit.text() == '':
        self.search_flag = True
        return
    self.search_index_list = search.search_fun(s=self.window.plainTextEdit.toPlainText(),
                                               pattern=self.window.lineEdit.text(),
                                               re_flag=self.window.checkBox.isChecked())
    self.window.plainTextEdit.clear()
    self.window.plainTextEdit.appendHtml(search.search_asAppendHtml(s, self.search_index_list, 'blue'))
    # 跳转到第一个搜索结果
    self.search_index_this = 1
    self.search_turn()
    # 
    self.search_flag = True

def search_pre(self):
    self.search_index_this = self.search_index_this - 1
    if self.search_index_this == 0:
        self.search_index_this = len(self.search_index_list)

def search_next(self):
    self.search_index_this = self.search_index_this + 1
    if self.search_index_this == len(self.search_index_list):
        self.search_index_this = 0

def search_turn(self):
    # 标签标记
    self.window.label: QLabel
    # 如果没有搜索结果
    if len(self.search_index_list) == 0:
        self.window.label.setText('1/0')
        return
    self.window.label.setText('%d/%d' % (self.search_index_this, len(self.search_index_list)))
    # 跳转
    self.window.plainTextEdit: QPlainTextEdit
    t = QTextCursor()
    t.setPosition(self.search_index_list[self.search_index_this - 1][0])
    self.window.plainTextEdit.setTextCursor(t)

标签:index,search,self,list,pyqt5,window,搜索,文本框,result
From: https://www.cnblogs.com/wd404/p/17366650.html

相关文章

  • 堆与二叉搜索树学习笔记
    部分内容来自OI-WIKI。1.堆堆的定义堆是一棵二叉树,满足每个节点的键值都大于等于它的父亲节点或者小于等于它的父亲节点。每个节点的键值都大于等于它的父亲节点的叫小根堆,每个节点的键值都小于等于它的父亲节点的叫大根堆。优先队列是一种抽象数据类型,它是一种容器,里面有......
  • C# 连接EXCEL 文本框保存输入信息
    部分代码:usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Windows.Forms;usingSystem.Data.OleDb;namespac......
  • pyqt5-QSplitter
    1、介绍QSplitter类是用于分裂器水平布局或垂直布局,效果是该组件内在水平或垂直方向上的直接子组件,可以用鼠标拖动子组件之间的分界线,以变化各自的宽度或长度。简单来说,就是在水平布局或垂直布局的固定分配上,允许各组件变化尺寸。2、类和初始化classQSplitter(QFrame):快速......
  • pyqt5-颜色
    1、颜色选择器col=QColorDialog.getColor()该行代码可以打开一个子窗口,选择颜色选择后可以点击确认或取消,都是返回一个PyQt5.QtGui.QColor对象,而并不会因为点击取消返回None点击确认时,col.name可以获取一个str类型,比如#7bf8ff,col.value都是int类型255点击取消时,col.name可......
  • pyqt5-右键菜单
    1、介绍pyqt支持两种类型的菜单,窗口的菜单和右键菜单。这里阐述右键菜单的使用。2、右键触发fromPyQt5.QtCoreimportQtself.ui.plainTextEdit:QPlainTextEditself.ui.plainTextEdit.setContextMenuPolicy(Qt.CustomContextMenu)self.ui.plainTextEdit.customContextMen......
  • pyqt5-QListWidget
    1、介绍list组件,或者说列表组件。2、类和初始化classQListWidget(QListView):快速查询:QListWidget(parent:typing.Optional[QWidget]=None)addItem(self,aitem:QListWidgetItem)addItem(self,label:str)addItems(self,labels:Iterable[str])clear(self)closeP......
  • 搜索引擎如何判断锚文本质量
    搜索引擎判断锚文本是否适合,主要通过如下几点判断:(1)锚文本植入符合文章需求,该出现的时候出现,不该出现的时候不要出现。(2)对所在文章有促进作用,用户阅读的时候可以通过锚文本扩展阅读。(3)能延展用户需求,挖掘用户额外需求并满足。(4)锚文本设置的数量和位置都做到依据文章的延展需求而定......
  • document.forms[0],得不到文本框的值,没错误提示的错误,表单提交
    我测试错误信息,可是我明明往文本框里输入值了,却告诉我没输入值,还不报错,我就找原因,检查了好几遍,也没找出错误,最后定位在document.forms[0],因为我的一个jsp里有好几个form表单,我那个得不到值的是最后一个表单,第4个,我就把document.forms[0]改成了document.forms[......
  • java 类似于google搜索提示的功能,文本框输入提示
    需要先导入数据库,并且在SearchSuggest中改数据库连接参数黑色头发:http://heisetoufa.iteye.com/......
  • lazada按关键字搜索商品API接口
    ​lazada按关键字搜索商品API接口,在lazada上搜索产品,如果只需要搜索单个产品的话,那么直接在搜索框输入“关键字”即可,如果需要多个产品,那么则需要进行关键字扩展。lazada按关键字搜索商品API接口分为两部分:1.查询列表部分:在列表部分输入“关键字”,即可查询到对应的商品列表;2......