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