如何基于QPlainTextEdit实现TXT编辑器未保存文件带*前缀标识功能
需求实现方案
你不需要手动做内容差异校验,Qt 原生提供了修改状态追踪能力,准确性和性能都远优于自定义内容比对逻辑。
核心原理
QPlainTextEdit 关联的 QTextDocument 对象会自动维护内容修改状态:内容和初始加载/上次保存的状态不一致时,isModified() 方法会返回 true,状态变更时会主动触发 modificationChanged(bool) 信号,直接监听该信号即可实现需求。
该方案完全不需要你手动做内容哈希或者全量比对,Qt 内部已经在每次文本变更时维护了修改标记,即便是 MB 级别的大文本文件也不会有额外性能损耗。
具体实现步骤
- 文件加载完成后重置文档修改状态
将文件内容写入 QPlainTextEdit 后,调用plainTextEdit->document()->setModified(false)把初始状态标记为未修改,此时文件名正常显示即可。 - 绑定修改状态变化信号
在窗口初始化逻辑中绑定信号槽,示例如下:
PyQt/PySide 写法:
C++ Qt 写法:# PyQt6/PySide6 示例 self.plain_text_edit.modificationChanged.connect(self.update_file_title)connect(ui->plainTextEdit, &QPlainTextEdit::modificationChanged, this, &MainWindow::updateFileTitle); - 实现文件名更新槽函数
根据返回的修改状态动态调整文件名前缀:def update_file_title(self, is_modified: bool): # current_file_name 替换为你当前打开的文件名变量 if is_modified: self.setWindowTitle(f"*{self.current_file_name} - 极简文本编辑器") # 如果是标签页显示文件名,对应修改标签文本即可 else: self.setWindowTitle(f"{self.current_file_name} - 极简文本编辑器") - 保存后重置修改状态
用户点击保存按钮、文件写入磁盘完成后,调用self.plain_text_edit.document().setModified(False),此时会自动触发modificationChanged信号,槽函数会自动移除文件名前的 * 前缀,无需手动重复调用更新逻辑。
多标签页场景适配
如果你的编辑器支持同时打开多个文件,只需要给每个标签页对应的 QPlainTextEdit 实例单独绑定信号,各自维护自己的修改状态即可。
内容的提问来源于stack exchange,提问作者ManComeOn
相关产品推荐
相关产品推荐

