首页 > 解决方案 > 为什么格式会在单独的 QTextDocuments 之间延续,我该如何防止它?

问题描述

我目前正在使用 QTextEdit 开发 WYSIWYG 文本编辑器。每次加载新文件时,我都会重置并重新格式化 QTextDocument,读取文件(空白),然后将.setHtml()其内容发送到编辑器。我打算让每个新创建的文件始终在单个函数中定义相同的默认样式。

相反,输入到空文件中的新文本正在接收来自先前加载的 QTextDocument 的格式,而不是默认为我提供的格式。如果我将语法突出显示的代码复制粘贴到一个文档中,然后创建并键入一个新文档,这是最明显的。字体、字体颜色和背景颜色都将延续到新文档中,尽管它不存在于其 html 结构中。


这是在将任何文件加载到 QTextEdit 之前我当前正在运行的函数:

fontDefault = QFont()
fontDefault.setFamily("Yantramanav")
fontDefault.setPointSize(11)
fontDefault.setWeight(QFont.Normal)

# editor is a QTextEdit.
def reset_document(editor, defaultFont=fontDefault):
    newDocument = QTextDocument()
    newDocument.setDocumentMargin(12)
    newDocument.setDefaultFont(defaultFont)

    editor.setDocument(newDocument)
    editor.setCurrentFont(defaultFont)

    # Stored on the QTextEdit yet is reset when replacing the QTextDocument.
    editor.setTabStopWidth(33)

我曾假设当存储格式的文档被替换时,任何旧格式都会丢失。为什么不是这种情况?如何确保只应用我的默认样式?

标签: pythonpyqt5pyside2qtexteditqtextdocument

解决方案


QTextCursor 在文档之间携带先前的 charFormat。即使它指向的 QTextDocument 被替换,光标本身仍然存在并分配给新文档。这个过程显然不会导致光标从其当前位置采样 charFormat,每次移动光标时都会发生这种情况,因此它仍然从上一个文档中的最后一个位置携带 charFormat。

防止这种重叠就像替换或移动光标一样简单,这两者都会导致光标从新文档中获取其 charFormat。将以下内容之一添加到reset_document()函数中:

# 1. Remove old formatting by replacing the cursor.
newCursor = QTextCursor(newDocument)
editor.setTextCursor(newCursor)
# 2. Remove old formatting by moving the cursor.
oldCursor = editor.textCursor()
oldCursor.movePosition(QTextCursor.Start, QTextCursor.MoveAnchor)
editor.setTextCursor(oldCursor)


推荐阅读