TweentyOneGuns 2023-12-17 20:46 采纳率: 75%
浏览 31
已结题

怎么实现QTextEdit文本全局替换的功能

先解释一下问题的由来

查找和替换是文本编辑的基本功能
查找很简单,因为有现成的find()函数
但是对于替换,如果只要单次替换一个字符串

textEdit = QTextEdit()
text = textEdit.toPlainText()
text.find(oldString)
cursor = text.textCursor()
cursor.insertText(newString) 

简单的几句就可以完成,因为find()本身除了查找以外,也隐含了对游标的位置移动(movePosition),以及对查找的字符串的选择(keepAnchor)
除此以外还有两个我特别关注的点:

  • find()支持QTextEdit内置的方法undo(),就是说支持撤销操作
  • find()的效率足够高,几十MB的文本文件也没有太大压力

现在我想实现更高级的功能:全部替换,而且也能胜任上述两个需求
这个时候问题来了
如果只要实现全部替换的功能倒是有很取巧的操作

textEdit.setPlainText(text.replace(oldString, newString))

可是一旦这么做以后,undo()的功能就失效了,虽然不清楚底层原理,但也可以大致猜想应该是一旦setPlaintText,undo()会被重置;
还有一种方法就是重复调用单次替换的操作,看起来很美好,但是效能惨不忍睹,想想看每次替换后都需要重新获取文本内容,重新定位字符串的位置,一旦文本内容变大,计算的复杂度大概会呈指数级增长(猜的),实测结果根本扛不住

所以我的问题是 有没有更好的方法来实现全局替换?而且能满足上述两个需求?
似乎QTextEdit 可以多重选择,也许有一个正统的方法,但我不知道怎么做

  • 写回答

13条回答 默认 最新

  • bug菌¹ Java领域优质创作者 2023-12-17 22:01
    关注

    该回答引用ChatGPT,望对题主有所帮助/启发;若有帮助,还望采纳。


    实现QTextEdit的全局替换功能,可以考虑使用QTextCursor来实现。以下是一个示例代码:

    def replace_all(text_edit, old_string, new_string):
        cursor = text_edit.textCursor()
        cursor.beginEditBlock()  # 开始编辑块,将一系列编辑操作视为一个整体,可撤销
        cursor.movePosition(QtGui.QTextCursor.Start)  # 移动到文本开始位置
        while cursor.find(old_string):
            cursor.insertText(new_string)  # 替换为新字符串
        cursor.endEditBlock()  # 结束编辑块,可撤销
    
    # 使用示例
    text_edit = QTextEdit()
    text = text_edit.toPlainText()
    replace_all(text_edit, "old_string", "new_string")
    

    这段代码通过循环调用find()来遍历整个文本,找到所有匹配的字符串并替换为新的字符串。每次替换都是在当前的游标位置进行,因此能够满足你所描述的需求。

    此外,调用beginEditBlock()endEditBlock()方法将一系列替换操作视为一个整体,从而实现撤销的功能。

    希望这个解决方案能满足你的需求!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(12条)

报告相同问题?

问题事件

  • 系统已结题 12月29日
  • 已采纳回答 12月21日
  • 创建了问题 12月17日

悬赏问题

  • ¥15 高价求中通快递查询接口
  • ¥15 解决一个加好友限制问题 或者有好的方案
  • ¥15 关于#java#的问题,请各位专家解答!
  • ¥15 急matlab编程仿真二阶震荡系统
  • ¥20 TEC-9的数据通路实验
  • ¥15 ue5 .3之前好好的现在只要是激活关卡就会崩溃
  • ¥50 MATLAB实现圆柱体容器内球形颗粒堆积
  • ¥15 python如何将动态的多个子列表,拼接后进行集合的交集
  • ¥20 vitis-ai量化基于pytorch框架下的yolov5模型
  • ¥15 如何实现H5在QQ平台上的二次分享卡片效果?