警告

本节包含从C++自动翻译到Python的代码片段,可能包含错误。

常见的富文本编辑任务

开发人员在使用Qt编辑和处理文本文档时,通常会执行许多任务。这些任务包括使用显示小部件,如QTextBrowser和QTextEdit,使用QTextDocument创建文档,使用QTextCursor进行编辑,以及导出文档结构。本文档概述了一些使用富文本类执行这些任务的更常见方法,展示了可以在您自己的应用程序中重用的便捷模式。

使用QTextEdit

可以按照以下方式构建和使用文本编辑器小部件来显示HTML:

editor = QTextEdit(parent)
editor.setHtml(aStringContainingHTMLtext)
editor.show()

默认情况下,文本编辑器包含一个带有根框架的文档,其中包含一个空的文本块。可以获取此文档,以便应用程序直接修改它:

document = editor.document()

文本编辑器的光标也可以用来编辑文档:

cursor = editor.textCursor()

尽管可以使用多个光标同时编辑文档,但QTextEdit一次只显示一个光标。因此,如果我们想要更新编辑器以显示特定的光标或其选择,我们需要在修改文档后设置编辑器的光标:

editor.setTextCursor(cursor)

选择文本

通过使用类似于用户在文本编辑器中执行的操作来移动光标来选择文本。要在文档中的两个点之间选择文本,我们需要将光标定位在第一个点,然后使用特殊模式(MoveMode)和移动操作(MoveOperation)来移动它。当我们选择文本时,我们将选择锚点留在旧的光标位置,就像用户在按住Shift键选择文本时可能会做的那样:

cursor.movePosition(QTextCursor.StartOfWord)
cursor.movePosition(QTextCursor.EndOfWord, QTextCursor.KeepAnchor)

在上述代码中,使用此方法选择了一个完整的单词。QTextCursor 提供了许多常见的移动操作,用于选择单个字符、单词、行和整个块。

查找文本

QTextDocument 提供了一个基于光标的搜索接口,使得在文本编辑器的风格中查找和修改文本变得容易。以下代码查找文档中特定单词的所有实例,并更改每个实例的颜色:

newCursor = QTextCursor(document)
while not newCursor.isNull() and not newCursor.atEnd():
    newCursor = document.find(searchString, newCursor)
    if not newCursor.isNull():
        newCursor.movePosition(QTextCursor.WordRight,
                               QTextCursor.KeepAnchor)
        newCursor.mergeCharFormat(colorFormat)

请注意,光标不必在每次搜索和替换操作后移动;它始终定位在刚刚替换的单词的末尾。

打印文档

QTextEdit 设计用于显示在屏幕上阅读的大型富文本文档,以与网页浏览器相同的方式呈现它们。因此,它不会自动将文档内容分成适合打印的页面大小的部分。

QTextDocument 提供了一个 print() 函数,允许使用 QPrinter 类打印文档。以下代码展示了如何在 QTextEdit 中准备文档以便使用 QPrinter 进行打印:

document = editor.document()
printer = QPrinter()
dlg = QPrintDialog(printer, self)
if dlg.exec() != QDialog.Accepted:
    return
document.print(printer)

文档是从文本编辑器中获取的,然后使用QPrintDialog构建并配置了一个QPrinter。如果用户接受了打印机的配置,则使用print()函数对文档进行格式化并打印。