文章目录
前言
官方文档 Rich Text Processing - Document Layouts
文档的布局仅在要在设备上显示或请求某些需要文档的可视表示形式的信息时才相关。在发生这种情况之前,不需要为设备格式化和准备文档。
概述
每个文档的布局由QAbstractTextDocumentLayout 类的子类管理。此类为布局和呈现引擎提供了一个通用的接口。默认呈现行为当前在私有类中实现。此方法可以创建自定义布局,并提供准备打印页面或导出到便携式文档格式 (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();
我们创建一个文本布局,指定要显示的文本字符串和要使用的字体。通过从文本格式获取文本行并使用可用空间换行其余文本,我们确保我们提供的文本格式正确。当我们向下移动页面时,这些线条被定位。
格式化的文本可以绘制到油漆设备上;在上面的代码中,文本直接绘制到小部件上。