文档布局
文档的布局只有在需要在设备上显示时,或者需要文档的可视表示来请求某些信息时才有意义。在此之前,不需要为设备格式化和准备文档。
概述
每个文档的布局是由QAbstractTextDocumentLayout类的一个子类管理的。该类为布局和呈现引擎提供了一个公共接口。默认呈现行为目前在私有类中实现。这种方法使创建自定义布局成为可能,并提供了在准备打印页面或导出为可移植文档格式(Portable Document Format, PDF)文件时使用的机制。
示例-形状文本布局
有时候,能够在不规则形状的区域内格式化纯文本是很重要的,例如在呈现自定义小部件时。Scribe提供了一些通用特性,比如QTextLayout类提供的特性,帮助开发人员执行换行和布局任务,而不需要首先创建文档。
格式化和绘制纯文本段落是很简单的。下面的示例将使用单一字体围绕圆圈的右侧边缘布局一段文本。
QTextLayout textLayout(text, font);
qreal margin = 10;
qreal radius = qMin(width()/2.0, height()/2.0) - margin;
QFontMetrics fm(font);
qreal lineHeight = fm.height();
qreal y = 0;
textLayout.beginLayout();
while (1) {
// create a new line
QTextLine line = textLayout.createLine();
if (!line.isValid())
break;
qreal x1 = qMax(0.0, pow(pow(radius,2)-pow(radius-y,2), 0.5));
qreal x2 = qMax(0.0, pow(pow(radius,2)-pow(radius-(y+lineHeight),2), 0.5));
qreal x = qMax(x1, x2) + margin;
qreal lineWidth = (width() - margin) - x;
line.setLineWidth(lineWidth);
line.setPosition(QPointF(x, margin+y));
y += line.height();
}
textLayout.endLayout();
QPainter painter;
painter.begin(this);
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, 2*radius, 2*radius));
painter.end();
我们创建一个文本布局,指定要显示的文本字符串和要使用的字体。通过从文本格式中获取文本行,并使用可用空间对剩余文本进行换行,我们确保提供的文本格式正确。当我们往下页移动时,这些线条就被定位了。
格式化后的文本可以绘制到绘画设备上;在上面的代码中,文本直接绘制到一个小部件上。
注:本文翻译自Qt官方文档。