python QsciScintilla 实现查找功能

功能:

1.支持 正则表达式 查找

2.支持 向上查找

3.支持 区分大小写 查找

4.支持 整个单词 查找

5.支持 循环查找

效果图:

代码:

from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.Qsci import *
import sys


class FindAndReplace(QWidget):
    def __init__(self, *arg, **kwarg):
        super(self.__class__, self).__init__(*arg, **kwarg)

        rows = QVBoxLayout()

        self.editor = QsciScintilla()
        self.editor.setText(f'{"x"*40}\n{"y"*40}\n{"z"*40}\n')
        rows.addWidget(self.editor)

        self.text_to_find = ''
        self.state_ = tuple()

        self.find = QLineEdit()
        self.find_previous = QPushButton('&Previous')
        self.find_next = QPushButton('&Next')
        self.find_lbl = QLabel('&Find')
        self.find_lbl.setBuddy(self.find)
        row = QHBoxLayout()
        for w in (self.find_lbl, self.find, self.find_previous, self.find_next):
            row.addWidget(w)
        rows.addLayout(row)

        self.re = QCheckBox('&Regular expressions')
        self.cs = QCheckBox('&Case sensitive')
        self.wo = QCheckBox('Whole &words')
        self.wrap = QCheckBox('Wrap aroun&d')
        self.show_ = QCheckBox('&Unfold folded text')
        self.posix = QCheckBox('POSI&X-compatible RE')
        row = QHBoxLayout()
        for w in (self.re, self.cs, self.wo, self.wrap, self.show_, self.posix):
            row.addWidget(w)
        rows.addLayout(row)

        self.setLayout(rows)

        self.find_previous.clicked.connect(lambda: self.findText(forward = False))
        self.find_next.clicked.connect(lambda: self.findText(forward = True))

    def findText(self, forward):
        text_to_find = self.find.text()

        if forward:
            line, index = self.editor.getSelection()[2:]
        else:
            line, index = self.editor.getSelection()[:2]

        state_ = (
            self.re.isChecked(), self.cs.isChecked(),
            self.wo.isChecked(), self.wrap.isChecked(),
            forward, line, index,
            self.show_.isChecked(), self.posix.isChecked(),
        )

        self.text_to_find = text_to_find
        self.state_ = state_
        self.editor.findFirst(text_to_find, *state_)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    FindAndReplace().show()
    sys.exit(app.exec_())

  • 10
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值