PySide6文本编辑器高效查找功能实现

PySide6 文本编辑器实现查找功能(重构版本)

核心思路

重构后的查找功能采用模型-视图-控制器(MVC)架构,将界面逻辑与业务逻辑分离。通过自定义信号槽机制实现高内聚低耦合,支持跨线程操作和可扩展的查找策略模式。

查找功能实现

创建查找对话框类 继承QDialog构建独立查找窗口,支持大小记忆和快捷键绑定。典型构造函数如下:

class FindDialog(QDialog):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setWindowTitle("查找")
        self.find_line = QLineEdit()
        self.case_check = QCheckBox("区分大小写")
        self.whole_check = QCheckBox("全词匹配")
        self.find_btn = QPushButton("查找下一个")
        
        layout = QVBoxLayout()
        layout.addWidget(self.find_line)
        layout.addWidget(self.case_check)
        layout.addWidget(self.whole_check)
        layout.addWidget(self.find_btn)
        self.setLayout(layout)
        
        self.find_btn.clicked.connect(self.emit_find_signal)

文本搜索核心算法 采用QTextDocument的查找接口实现高效搜索,支持正则表达式和多种匹配模式:

def find_text(self, text, flags=0):
    cursor = self.textCursor()
    document = self.document()
    
    if flags & QTextDocument.FindBackward:
        found = document.find(text, cursor, flags)
    else:
        found = document.find(text, cursor.position(), flags)
        
    if not found.isNull():
        self.setTextCursor(found)
        return True
    return False

性能优化策略

增量搜索技术 实现延迟搜索机制,避免高频输入时的性能损耗:

self.search_timer = QTimer()
self.search_timer.setInterval(300)
self.search_timer.setSingleShot(True)
self.find_line.textChanged.connect(self.start_search_timer)

def start_search_timer(self):
    self.search_timer.start()
    
def do_search(self):
    text = self.find_line.text()
    if text:
        self.highlight_all(text)

结果高亮系统 使用QSyntaxHighlighter实现可视化匹配标记:

class SearchHighlighter(QSyntaxHighlighter):
    def __init__(self, parent):
        super().__init__(parent)
        self.matches = []
        
    def highlightBlock(self, text):
        fmt = QTextCharFormat()
        fmt.setBackground(QBrush(QColor("#FFEE56")))
        
        for match in self.matches:
            if match.start() >= self.position() and match.end() <= self.position() + len(text):
                self.setFormat(match.start()-self.position(), match.length(), fmt)

高级功能实现

多文档搜索支持 通过观察者模式实现跨文档搜索:

class SearchManager(QObject):
    searchRequested = pyqtSignal(str, int)
    
    def register_editor(self, editor):
        self.searchRequested.connect(editor.find_text)
        
    def unregister_editor(self, editor):
        self.searchRequested.disconnect(editor.find_text)

搜索历史记录 实现LRU缓存机制的搜索历史:

class SearchHistory:
    def __init__(self, max_size=10):
        self.history = deque(maxlen=max_size)
        
    def add_search(self, text):
        if text and text not in self.history:
            self.history.appendleft(text)
            
    def get_history(self):
        return list(self.history)

异常处理机制

边界条件处理 完善各种异常场景的处理逻辑:

try:
    if not self.find_text(search_str, flags):
        if self.last_search_pos == 0:
            QMessageBox.information(self, "查找", "已到达文档末尾")
        else:
            self.last_search_pos = 0
            self.find_text(search_str, flags)
except Exception as e:
    logger.error(f"Search error: {str(e)}")
    self.statusBar().showMessage("搜索出错", 2000)

测试方案

单元测试用例 使用pytest编写核心功能测试:

def test_find_function(editor):
    editor.setPlainText("Hello World")
    assert editor.find_text("World") is True
    assert editor.textCursor().selectedText() == "World"
    
def test_case_sensitive(editor):
    editor.setPlainText("Python python")
    assert editor.find_text("python", QTextDocument.FindCaseSensitively) is True
    assert editor.textCursor().selectedText() == "python"

部署建议

插件化架构 将查找功能设计为可插拔模块:

class FindPlugin:
    def __init__(self, editor):
        self.editor = editor
        self.setup_ui()
        
    def setup_ui(self):
        self.dialog = FindDialog(self.editor)
        self.editor.addAction(
            QAction("查找...", self.editor, triggered=self.dialog.show)
        )

该实现方案通过模块化设计提高了代码可维护性,采用现代UI模式增强用户体验,性能优化措施确保处理大文档时的流畅性,测试驱动开发保证功能稳定性。

BbS.okacop092.info/PoSt/1120_701067.HtM
BbS.okacop093.info/PoSt/1120_972062.HtM
BbS.okacop094.info/PoSt/1120_097327.HtM
BbS.okacop095.info/PoSt/1120_832837.HtM
BbS.okacop096.info/PoSt/1120_982043.HtM
BbS.okacop097.info/PoSt/1120_738586.HtM
BbS.okacop098.info/PoSt/1120_656773.HtM
BbS.okacop099.info/PoSt/1120_279748.HtM
BbS.okacop114.info/PoSt/1120_468244.HtM
BbS.okacop829.info/PoSt/1120_600909.HtM
BbS.okacop092.info/PoSt/1120_717383.HtM
BbS.okacop093.info/PoSt/1120_581258.HtM
BbS.okacop094.info/PoSt/1120_703648.HtM
BbS.okacop095.info/PoSt/1120_552951.HtM
BbS.okacop096.info/PoSt/1120_185231.HtM
BbS.okacop097.info/PoSt/1120_032237.HtM
BbS.okacop098.info/PoSt/1120_734492.HtM
BbS.okacop099.info/PoSt/1120_742636.HtM
BbS.okacop114.info/PoSt/1120_474382.HtM
BbS.okacop829.info/PoSt/1120_906354.HtM
BbS.okacop092.info/PoSt/1120_779481.HtM
BbS.okacop093.info/PoSt/1120_848442.HtM
BbS.okacop094.info/PoSt/1120_503593.HtM
BbS.okacop095.info/PoSt/1120_575623.HtM
BbS.okacop096.info/PoSt/1120_823993.HtM
BbS.okacop097.info/PoSt/1120_129432.HtM
BbS.okacop098.info/PoSt/1120_835613.HtM
BbS.okacop099.info/PoSt/1120_141539.HtM
BbS.okacop114.info/PoSt/1120_824935.HtM
BbS.okacop829.info/PoSt/1120_671284.HtM
BbS.okacop092.info/PoSt/1120_877829.HtM
BbS.okacop093.info/PoSt/1120_956803.HtM
BbS.okacop094.info/PoSt/1120_848010.HtM
BbS.okacop095.info/PoSt/1120_129546.HtM
BbS.okacop096.info/PoSt/1120_750964.HtM
BbS.okacop097.info/PoSt/1120_503766.HtM
BbS.okacop098.info/PoSt/1120_522527.HtM
BbS.okacop099.info/PoSt/1120_320825.HtM
BbS.okacop114.info/PoSt/1120_062490.HtM
BbS.okacop829.info/PoSt/1120_602314.HtM
BbS.okacop092.info/PoSt/1120_530516.HtM
BbS.okacop093.info/PoSt/1120_987884.HtM
BbS.okacop094.info/PoSt/1120_045916.HtM
BbS.okacop095.info/PoSt/1120_032375.HtM
BbS.okacop096.info/PoSt/1120_053708.HtM
BbS.okacop097.info/PoSt/1120_674114.HtM
BbS.okacop098.info/PoSt/1120_500313.HtM
BbS.okacop099.info/PoSt/1120_265219.HtM
BbS.okacop114.info/PoSt/1120_994418.HtM
BbS.okacop829.info/PoSt/1120_540997.HtM
BbS.okacop092.info/PoSt/1120_997063.HtM
BbS.okacop093.info/PoSt/1120_049627.HtM
BbS.okacop094.info/PoSt/1120_815693.HtM
BbS.okacop095.info/PoSt/1120_243680.HtM
BbS.okacop096.info/PoSt/1120_276706.HtM
BbS.okacop097.info/PoSt/1120_254860.HtM
BbS.okacop098.info/PoSt/1120_977713.HtM
BbS.okacop099.info/PoSt/1120_274539.HtM
BbS.okacop114.info/PoSt/1120_644314.HtM
BbS.okacop829.info/PoSt/1120_491109.HtM
BbS.okacop092.info/PoSt/1120_023393.HtM
BbS.okacop093.info/PoSt/1120_477645.HtM
BbS.okacop094.info/PoSt/1120_596798.HtM
BbS.okacop095.info/PoSt/1120_979038.HtM
BbS.okacop096.info/PoSt/1120_906532.HtM
BbS.okacop097.info/PoSt/1120_554465.HtM
BbS.okacop098.info/PoSt/1120_200987.HtM
BbS.okacop099.info/PoSt/1120_574588.HtM
BbS.okacop114.info/PoSt/1120_841159.HtM
BbS.okacop829.info/PoSt/1120_758446.HtM
BbS.okacop092.info/PoSt/1120_679194.HtM
BbS.okacop093.info/PoSt/1120_781656.HtM
BbS.okacop094.info/PoSt/1120_316207.HtM
BbS.okacop095.info/PoSt/1120_126929.HtM
BbS.okacop096.info/PoSt/1120_030669.HtM
BbS.okacop097.info/PoSt/1120_754721.HtM
BbS.okacop098.info/PoSt/1120_854579.HtM
BbS.okacop099.info/PoSt/1120_467376.HtM
BbS.okacop114.info/PoSt/1120_306688.HtM
BbS.okacop829.info/PoSt/1120_154701.HtM

#牛客AI配图神器#

全部评论

相关推荐

点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务