当前位置: 首页 > news >正文

PySide6 文本编辑器(QPlainTextEdit)实现查找对话功能(匹配完整单词,区分大小写)——重构版本

PySide6 文本编辑器(QPlainTextEdit)实现查找对话功能(匹配完整单词,区分大小写)——重构版本

核心知识
  • 复合俩个标志 实现向上查找并区分大小写且支持匹配完成单词。
  • 其他参见另一篇文章。
  • 查找标签
  • 通过位运算即可组合多个标志
参考
  • PySide6 自定义文本查找对话框(QFindTextDialog)以及调用示例
  • PySide6 文本编辑器(QPlainTextEdit)实现查找功能以及其区分大小写模式
主要修改
  1. 用户界面将 查找上下按钮 替换为 组合框内的 向上向下,并且默认为向下。灵感来源于win10记事本
  2. 将获取查找标签 分离出来 单独使用一个 类方法实现。
  3. 获取上下文本光标与设置上下文本光标 组合为设置文本光标 方便调用。
代码示例

这个是基于这篇文章的重构

# coding = utf-8from PySide6.QtWidgets import (QWidget,QVBoxLayout,QPlainTextEdit,QGroupBox,QRadioButton,QLineEdit,QPushButton,QCheckBox,QApplication)
from PySide6.QtCore import QRegularExpression
from PySide6.QtGui import QTextDocument,QTextCursor
import sysclass TestWidget(QWidget):def __init__(self):super().__init__()self.setupUi()self.setEventBind()def setupUi(self):"""设置用户界面"""self.setWindowTitle("查找下一个与是否区分大小写")# 主布局使用垂直盒子布局vboxLayout = QVBoxLayout(self)# 实例化 文本编辑器 查找行文本编辑器 查找下一个按钮 区分大小写复选框 self.plainTextEdit = QPlainTextEdit()self.findLineEdit = QLineEdit()# 方向 组合盒子self.directGroupBox = QGroupBox()self.directGroupBox.setTitle("方向")self.upButton = QRadioButton("向上(&U)")self.downButton = QRadioButton("向下(&D)")directVLayout = QVBoxLayout(self.directGroupBox)directVLayout.addWidget(self.upButton)directVLayout.addWidget(self.downButton)self.downButton.setChecked(True)self.caseSensitiveCheckBox = QCheckBox("区分大小写")self.findWordCheckBox = QCheckBox("匹配完整单词")self.findPushBtn = QPushButton("查找下一个")# 添加控件到主布局vboxLayout.addWidget(self.plainTextEdit)vboxLayout.addWidget(self.findLineEdit)vboxLayout.addWidget(self.directGroupBox)vboxLayout.addWidget(self.caseSensitiveCheckBox)vboxLayout.addWidget(self.findWordCheckBox)vboxLayout.addWidget(self.findPushBtn)def setEventBind(self):"""设置事件绑定"""self.findPushBtn.clicked.connect(self.setTextCursor)def getTextDocument(self) -> QTextDocument:"""获取文本文档:return: 文本编辑器的文本文档"""return self.plainTextEdit.document()def getTextCursor(self) -> QTextCursor:"""获取文本游标:return: 文本编辑器的文本光标"""return self.plainTextEdit.textCursor()def getRadioBtnStat(self) -> tuple[bool,bool]:"""获取按钮状态:return: 上一个与下一个按钮的点击状态 元组"""return (self.upButton.isChecked(),self.downButton.isChecked())def getCheckBoxStat(self) -> tuple[bool,bool]:"""获取复选框状态:return: 俩个复选框的状态"""return (self.caseSensitiveCheckBox.isChecked(),self.findWordCheckBox.isChecked())def getFindFlags(self):"""获取查找标签 组合"""# 查找标签 上一个 下一个 忽略大小写findPrev = QTextDocument.FindFlag.FindBackwardfindCase = QTextDocument.FindFlag.FindCaseSensitivelyfindWord = QTextDocument.FindFlag.FindWholeWords# 通过按钮是否点击 以及 复选框是否勾选 来返回flagsprevBtnStat,nextBtnStat = self.getRadioBtnStat()caseBoxStat,wordBoxStat= self.getCheckBoxStat()if nextBtnStat:flags = 0if caseBoxStat and wordBoxStat:flags = findCase | findWordelif caseBoxStat:flags = findCaseelif wordBoxStat:flags = findWordelif prevBtnStat:flags = findPrevif caseBoxStat and wordBoxStat:flags = findPrev | findCase | findWordelif caseBoxStat:flags = findPrev | findCaseelif wordBoxStat:flags = findPrev | findWordreturn flagsdef getNextTextCursor(self):"""查找下一个文本光标"""# 查找 单行文本框控件 光标位置searchStr = self.findLineEdit.text()regex = QRegularExpression(searchStr)# 获取文本文档 文本光标document = self.getTextDocument()cursor = self.getTextCursor()# 获取标签flags = self.getFindFlags()# 查找下一个if flags:nextCusror = document.find(regex,cursor,flags)else:nextCusror = document.find(regex,cursor)return nextCusrordef getPrevTextCursor(self):"""获取上一个文本光标"""# 查找 单行文本框控件 光标位置searchStr = self.findLineEdit.text()regex = QRegularExpression(searchStr)# 获取文本文档 文本光标document = self.getTextDocument()cursor = self.getTextCursor()# 获取查找光标flags = self.getFindFlags()prevCursor = document.find(regex,cursor,flags)return prevCursordef setNextTextCursor(self):"""设置下一个文本光标"""nextTextCursor = self.getNextTextCursor()self.plainTextEdit.setTextCursor(nextTextCursor)def setPrevTextCursor(self):"""设置上一个文本光标"""nextTextCursor = self.getPrevTextCursor()self.plainTextEdit.setTextCursor(nextTextCursor)def setTextCursor(self):"""设置文本光标"""upBtnStat,downBtnStat = self.getRadioBtnStat()if upBtnStat:self.setPrevTextCursor()else:self.setNextTextCursor()if __name__ == "__main__":app = QApplication(sys.argv)testWidget = TestWidget()testWidget.show()sys.exit(app.exec())
界面效果

界面效果

http://www.dtcms.com/a/461836.html

相关文章:

  • golang面经——GMP相关
  • 谷歌英文网站简单的网站php开发教程
  • 免费一键自助建站官网域名及对应网站
  • AI编程Cursor最强竞争对手来了,CodeX三种操作系统喂饭级安装教程!
  • Spring Cloud Alibaba 最新五大核心组件
  • 融乐Mini1.9.3 | 支持在线播放,本地播放,内置两条线路,免费畅听全网音乐
  • 车行网站源码微信公众平台营销
  • 客户端加密 和 服务端加密:端到端安全的真正含义
  • 88-python电网可视化项目-8-1
  • 做网站要自己租服务器吗wordpress打开速度优化
  • 要看网站是多少建设一个网站需要哪些费用
  • 物联网时代下无锡漫途科技无线多参数遥测终端助力饮水安全监测
  • 公司网站建设款计什么科目wordpress jquery版本
  • 麒麟系统如何设置.sh文件的图标
  • 3D GPR切片图
  • 深圳建设网站制作公司怎样制作一个网页
  • 腾讯云手机适用于哪些人群
  • 云南技术网站建设销售编程代码入门教学
  • 【PalladiumZ2 使用专栏 5 -- 模拟电路是否可以仿真?】
  • 公司网站文化活动备案上海企业建站方案
  • AI智能体开发实战(开源版)
  • 手动添加 SSH 私钥到 ssh-agent 以解决Permission denied (publickey) 错误
  • 用网站建设费用wordpress网站后台
  • 大模型前世今生(八):大模型的预训练
  • Tiff编码解码器封装
  • Android 性能优化 — Profiler 使用指南
  • DynamoDB 到 Redshift Zero-ETL 集成:完整实施指南
  • 长沙软件公司排行-专业软件开发公司
  • 深圳网站建设电话wordpress linux 伪静态
  • 缺少需求评审会导致哪些严重后果?