文档的布局只有当它要显示在设备上,或者当某些信息需要文档的可视化表示时才相关。在此之前,不需要为设备格式化和准备文档。
每个文档的布局由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();
我们创建一个文本布局,指定要显示的文本字符串和要使用的字体。通过从文本格式中获取文本行,并使用可用的空间包装剩余的文本,我们确保所提供的文本格式正确。当我们沿着页面向下移动时,线条就被定位了.
格式化的文本可以绘制到绘图设备上;在上面的代码中,文本直接绘制到小部件上.