警告

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

文档布局

文档的布局仅在需要在设备上显示时,或当需要文档的视觉表示时才有意义。在此之前,文档不需要为设备进行格式化和准备。

概述

每个文档的布局由QAbstractTextDocumentLayout类的子类管理。该类为布局和渲染引擎提供了一个通用接口。默认的渲染行为目前在一个私有类中实现。这种方法使得创建自定义布局成为可能,并提供了在准备页面以进行打印或导出为便携式文档格式(PDF)文件时使用的机制。

示例 - 形状文本布局

有时,能够在不规则形状区域内格式化纯文本是很重要的,例如在渲染自定义小部件时。Scribe提供了通用功能,例如QTextLayout类提供的功能,以帮助开发人员执行换行和布局任务,而无需先创建文档。

../_images/plaintext-layout.png

格式化和绘制一段纯文本是直接的。下面的示例将使用单一字体围绕圆的右侧边缘布局一段文本。

textLayout = QTextLayout(text, font)
margin = 10
radius = qMin(width()/2.0, height()/2.0) - margin
fm = QFontMetrics(font)
lineHeight = fm.height()
y = 0
textLayout.beginLayout()
while 1:
    # create a new line
    line = textLayout.createLine()
    if not line.isValid():
        break
    x1 = qMax(0.0, pow(pow(radius,2)-pow(radius-y,2), 0.5))
    x2 = qMax(0.0, pow(pow(radius,2)-pow(radius-(y+lineHeight),2), 0.5))
    x = qMax(x1, x2) + margin
    lineWidth = (width() - margin) - x
    line.setLineWidth(lineWidth)
    line.setPosition(QPointF(x, margin+y))
    y += line.height()

textLayout.endLayout()
painter = QPainter()
painter.begin(self)
painter.setRenderHint(QPainter.Antialiasing)
painter.fillRect(rect(), Qt.white)
painter.setBrush(QBrush(Qt.black))
painter.setPen(QPen(Qt.black))
textLayout.draw(painter, QPoint(0,0))
painter.setBrush(QBrush(QColor("#a6ce39")))
painter.setPen(QPen(Qt.black))
painter.drawEllipse(QRectF(-radius, margin, 2radius, 2radius))
painter.end()

我们创建一个文本布局,指定我们想要显示的文本字符串和要使用的字体。我们通过从文本格式中获取文本行,并使用可用空间包装剩余文本,确保我们提供的文本格式正确。随着我们向下移动页面,这些行被定位。

格式化文本可以绘制到绘图设备上;在上述代码中,文本直接绘制到小部件上。