警告
本节包含从C++自动翻译到Python的代码片段,可能包含错误。
文档布局¶
文档的布局仅在需要在设备上显示时,或当需要文档的视觉表示时才有意义。在此之前,文档不需要为设备进行格式化和准备。
概述¶
每个文档的布局由QAbstractTextDocumentLayout类的子类管理。该类为布局和渲染引擎提供了一个通用接口。默认的渲染行为目前在一个私有类中实现。这种方法使得创建自定义布局成为可能,并提供了在准备页面以进行打印或导出为便携式文档格式(PDF)文件时使用的机制。
示例 - 形状文本布局¶
有时,能够在不规则形状区域内格式化纯文本是很重要的,例如在渲染自定义小部件时。Scribe提供了通用功能,例如QTextLayout类提供的功能,以帮助开发人员执行换行和布局任务,而无需先创建文档。
格式化和绘制一段纯文本是直接的。下面的示例将使用单一字体围绕圆的右侧边缘布局一段文本。
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()
我们创建一个文本布局,指定我们想要显示的文本字符串和要使用的字体。我们通过从文本格式中获取文本行,并使用可用空间包装剩余文本,确保我们提供的文本格式正确。随着我们向下移动页面,这些行被定位。
格式化文本可以绘制到绘图设备上;在上述代码中,文本直接绘制到小部件上。