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

PySide 查找功能大杂烩 基于文本编辑器(QPlainTextEdit)

文章目录

      • PySide 查找功能大杂烩 基于文本编辑器(QPlainTextEdit)
        • 实现功能一览
        • 技术问题
        • 代码
        • 参考

PySide 查找功能大杂烩 基于文本编辑器(QPlainTextEdit)

实现功能一览
  • 向上或向下查找
  • 区分大小写
  • 匹配完整单词
  • 循环
  • 向上或向下与其他的组合
技术问题

在前几篇文章中存在如下问题:

  1. 使用文本编辑器的文档方法(QPlainTextEdit.document)返回的文本文档(QTextDocumet)的查找方法(find)返回的文本光标(QTextCursor)
  2. 借助文本编辑器的设置文本光标(QPlainTextEdit.setTextCursor)结合1的文本光标来实现查找功能

出现问题

看似一切都合乎情理之中,但是问题的出现往往是意想不到!就在我要实现循环功能的时候,我绞尽脑汁还是没有好的办法,好在天无绝人之路!我测试文本编辑(QPlainTextEdit)的时候意外发现他的查找符合我的需求!
于是以前写的代码好像小丑一样!明明你已经有轮子可用了,却非要绕一大圈。当然这也是PyQt\PySide这类文章或者书记少导致的。

反思

能使用当前对象的方法,就不要再深入其父类这样不仅加重了代码量还使得逻辑变得复杂!

看完下边的代码,你就知道我之前的代码有多么搞笑了!

代码

重要的

这篇文件以及关于PySide6的都是关于我写的一个记事本项目的实现!(仿照win10的记事本)!
代码是基于文本编辑器(QPlainTextEdit)但是也适合文本编辑(QTextEdit)

# coding = utf-8from PySide6.QtWidgets import (QWidget,QVBoxLayout,QPlainTextEdit,QGroupBox,QRadioButton,QLineEdit,QPushButton,QCheckBox,QApplication,QMessageBox)
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.cycleCheckBox = 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.cycleCheckBox)vboxLayout.addWidget(self.findPushBtn)def setEventBind(self):"""设置事件绑定"""self.findPushBtn.clicked.connect(self.setCursor)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 getCycleCheckBoxStat(self) -> bool:"""获取循环复选框的状态:return: True or False"""return self.cycleCheckBox.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 setCursor(self):"""设置光标"""# 使用QPlainTextEdit的find功能 配合QRegularExpression 传入查找标签的文本 # 再结合获取光标标签来实现findStr = self.findLineEdit.text()exp = QRegularExpression(findStr)flags = self.getFindFlags()if flags:findRes = self.plainTextEdit.find(exp,flags)self.isResetCursor(findRes)else:findRes = self.plainTextEdit.find(exp)self.isResetCursor(findRes)def setNoFindMsgBox(self,findResult:bool):"""弹出找不到提示"""if findResult == False:findStr = self.findLineEdit.text()# 提示窗口msgBox = QMessageBox(self)msgBox.setWindowTitle("记事本") #查找窗口太小 时不会显示msgBox.setIcon(QMessageBox.Icon.Information)msgBox.setText(f'"{findStr}"')msgBox.exec()def isResetCursor(self,findResult:bool):"""重新设置光标"""cycleStatus = self.getCycleCheckBoxStat()prevBtnStat,nextBtnStat = self.getRadioBtnStat()# 如果勾选 按钮为向上 从最后开始查找# 如果勾选 按钮为向下 从开头开始查找if cycleStatus:if prevBtnStat and findResult == False:self.plainTextEdit.moveCursor(QTextCursor.MoveOperation.End)elif nextBtnStat and findResult == False:self.plainTextEdit.moveCursor(QTextCursor.MoveOperation.Start)else:if findResult == False:self.setNoFindMsgBox(findResult)if __name__ == "__main__":app = QApplication(sys.argv)testWidget = TestWidget()testWidget.show()sys.exit(app.exec())
参考
  • 建议先看重构版
    PySide6专栏
http://www.dtcms.com/a/495400.html

相关文章:

  • Vue3 路由配置和使用与讲解(超级详细)
  • 东盟建设集团重庆工程有限公司网站500强企业排名(2022最新名单)
  • 初次使用基于K3S的大数据平台
  • 极简入门Zookeeper
  • 国产工业软件:制造强国的“破局”之路
  • 从重机展到全球市场:数字化助力装备制造企业实现规范化管理
  • 半导体制造工艺基本认识 二 氧化
  • MongoDB 是关系型数据库吗?
  • 织梦dedecms网站内容页wordpress rss导入
  • RAG各模块联合优化思路:多智能体协作建模-MMOA-RAG浅尝
  • 【小白笔记】KNN 核心预测函数 _predict_one 的过程
  • 营销人职业成长路径:从执行到战略的能力进阶与知识体系构建
  • Elasticsearch 推理 API 增加了开放的可定制服务
  • 做电影网站还能赚钱ace wordpress
  • 建设农家书屋官方网站临沂设计网站的公司
  • 10.queue的模拟实现
  • 有多少网站可以推广业务阿里云个人网站建设
  • 【知识点总结】Vue2 与 Vue2 区别
  • 【CV】神经网络中哪些参数需要被学习?
  • Spring两大漏洞可导致泄露敏感信息及安全防护绕过(CVE-2025-41253/41254)
  • 了解一个文件签名验证工具——sigverif
  • 河北建筑网站江小白网络营销案例
  • 张家口网站建设开发网站开发案例教程
  • 【NestJS】class-transformer什么用
  • 【word多文档docx合并】
  • Endnote | word中加载项消失不见,如何处理?
  • 聊聊 Unity(小白专享、C# 小程序 之 图片播放器)
  • 查询个人房产信息网站查看wordpress密码破解
  • 做网站用什么框架dede淘宝客网站
  • 高级篇:Python脚本(101-150)