PySide6 文本编辑器(QPlainTextEdit)实现查找功能——重构版本

PySide6 文本编辑器(QPlainTextEdit)实现查找功能------重构版本

核心
  1. 文本文档实例(QTextDocument)用于传入文本光标(QTextCursor)
  2. 正则表达式(QRegularExpression) 用于匹配查找内容
  3. 文本文档的查找方法(QPlainTextEdit.find)
  4. 将光标移动到指定的位置(QPlainTextEdit.setTextCursor
  5. 一个全局变量用于记录上一个文本光标的位置,一个局部变量用于记录下一个文本光标的位置

可选
查找标志

重构区别
  1. 设置用户界面代码更加简洁
  2. 实现基础的查找上一个(不支持循环)和下一个
  3. 未实现不区分大小写

旧版

代码示例
py 复制代码
# coding = utf-8

from PySide6.QtWidgets import (QApplication, QWidget, QLineEdit,QPlainTextEdit, QVBoxLayout,
                               QPushButton,QCheckBox)
from PySide6.QtCore import QRegularExpression
from PySide6.QtGui import QTextCursor,QTextDocument
import sys



class MyWidget(QWidget):
    def __init__(self):
        super().__init__()
        self.setupUi()
        self.bindEvent()
        self.lasterCursor = None

    def setupUi(self):
        """设置用户界面
        """
        self.setWindowTitle("测试查找")

        # 主窗口使用垂直布局
        vBoxLayout = QVBoxLayout(self)

        # 创建文本编辑器 设置文本 行文本编辑器 按钮与 勾选框
        self.mytext = QPlainTextEdit()
        self.mytext.setPlainText(
                                "十年生死两茫茫,写程序,到天亮。\n"
                                 "千行代码,Bug何处藏。\n"
                                 "纵使上线又怎样,朝令改,夕断肠。"
                                 "\n相顾无言,惟有泪千行。\n "
                                 "每晚灯火阑珊处,夜难寐,加班狂。"
                                )   
        self.findLineEdit = QLineEdit()
        self.downPushButton = QPushButton("下一个!")
        self.upPushButton = QPushButton("上一个")
        self.caseSensitiveCheck = QCheckBox("区分大小写")
        
        vBoxLayout.addWidget(self.mytext)
        vBoxLayout.addWidget(self.downPushButton)
        vBoxLayout.addWidget(self.upPushButton)
        vBoxLayout.addWidget(self.caseSensitiveCheck)
        vBoxLayout.addWidget(self.findLineEdit)

    def bindEvent(self):
        self.downPushButton.clicked.connect(self.findNextText)
        self.upPushButton.clicked.connect(self.findPreviousText)

    def findNextText(self):
        """查找下一个文本
        """
        doc = self.mytext.document()
        searchText = self.findLineEdit.text()

        if not self.lasterCursor:
            self.lasterCursor = QTextCursor(doc)
        
        regex = QRegularExpression(searchText)
        nextCusror= doc.find(regex,self.lasterCursor)
        
        self.lasterCursor = nextCusror
        self.mytext.setTextCursor(nextCusror)
    
    def findPreviousText(self):
        """查找上一个文本
        """
        doc = self.mytext.document()
        searchText = self.findLineEdit.text()
        self.mytext.setTextCursor( self.lasterCursor)

        if not self.lasterCursor:
            self.lasterCursor = QTextCursor(doc)

        regex = QRegularExpression(searchText)
        prevCusor = doc.find(regex,self.lasterCursor,QTextDocument.FindFlag.FindBackward)
        
        self.lasterCursor = prevCusor
        self.mytext.setTextCursor(prevCusor)

 self.mytext.document().find(regex,self.lasterCursor,QTextDocument.FindFlag.FindCaseSensitively)
        
if __name__ == "__main__":
    app = QApplication(sys.argv)
    my = MyWidget()
    my.show()
    sys.exit(app.exec())

运行效果


相关推荐
疯狂的挖掘机21 小时前
记一次基于QT的图片操作处理优化思路(包括在图上放大缩小,截图,画线,取值等)
开发语言·数据库·qt
cnxy18821 小时前
围棋对弈Python程序开发完整指南:步骤4 - 提子逻辑和劫争规则实现
开发语言·python·机器学习
意趣新21 小时前
C 语言源文件从编写完成到最终生成可执行文件的完整、详细过程
c语言·开发语言
TheSumSt1 天前
Python丨课程笔记Part3:语法进阶部分(控制结构与基础数据结构)
数据结构·笔记·python
ha_lydms1 天前
5、Spark函数_s/t
java·大数据·python·spark·数据处理·maxcompute·spark 函数
李艺为1 天前
根据apk包名动态修改Android品牌与型号
android·开发语言
电商API&Tina1 天前
跨境电商 API 对接指南:亚马逊 + 速卖通接口调用全流程
大数据·服务器·数据库·python·算法·json·图搜索算法
Yyyyy123jsjs1 天前
外汇Tick数据交易时段详解与Python实战分析
人工智能·python·区块链
黄河滴滴1 天前
java系统变卡变慢的原因是什么?从oom的角度分析
java·开发语言
老华带你飞1 天前
农产品销售管理|基于java + vue农产品销售管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端