PySide6 文本编辑器(QPlainTextEdit)实现查找功能------重构版本
核心
- 文本文档实例(QTextDocument)用于传入文本光标(QTextCursor)
- 正则表达式(QRegularExpression) 用于匹配查找内容
- 文本文档的查找方法(QPlainTextEdit.find)
- 将光标移动到指定的位置(QPlainTextEdit.setTextCursor)
- 一个全局变量用于记录上一个文本光标的位置,一个局部变量用于记录下一个文本光标的位置
可选
查找标志
重构区别
- 设置用户界面代码更加简洁
- 实现基础的查找上一个(不支持循环)和下一个
- 未实现不区分大小写
代码示例
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())
运行效果