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

