Qt 富文本处理(04):文档布局【来自官档的翻译】

前言

官方文档 Rich Text Processing - Document Layouts

  文档的布局仅在要在设备上显示或请求某些需要文档的可视表示形式的信息时才相关。在发生这种情况之前,不需要为设备格式化和准备文档。

概述

  每个文档的布局由QAbstractTextDocumentLayout 类的子类管理。此类为布局和呈现引擎提供了一个通用的接口。默认呈现行为当前在私有类中实现。此方法可以创建自定义布局,并提供准备打印页面或导出到便携式文档格式 (PDF) 文件时使用的机制。

示例 - 形状文本布局

  有时,能够在不规则形状的区域中设置纯文本格式很重要,例如,在呈现自定义小部件时。Scribe 提供通用功能(如QTextLayout 类提供的功能)来帮助开发人员执行换字和布局任务,而无需先创建文档。

img

格式化和绘制纯文本段落非常简单。下面的示例将在圆的右侧边缘周围使用单一字体布局一段文本。

    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();

  我们创建一个文本布局,指定要显示的文本字符串和要使用的字体。通过从文本格式获取文本行并使用可用空间换行其余文本,我们确保我们提供的文本格式正确。当我们向下移动页面时,这些线条被定位。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值