文档布局简要说明了文档布局的作用

文档的布局只有当它要显示在设备上,或者当某些信息需要文档的可视化表示时才相关。在此之前,不需要为设备格式化和准备文档。

每个文档的布局由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();

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

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

猜你喜欢

转载自blog.csdn.net/wei375653972/article/details/85333963
今日推荐