【Qt】富文本框架(三、文档布局)

文章介绍了文档布局的重要性,特别是在设备显示和信息请求时。Qt框架中的QAbstractTextDocumentLayout类及其子类用于管理文档布局,支持默认的呈现行为以及自定义布局,例如在打印或导出为PDF时。示例展示了如何使用QTextLayout围绕圆圈的右侧边缘格式化和绘制文本,提供了一种在不规则形状区域内格式化文本的方法。
摘要由CSDN通过智能技术生成

文档布局 

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

概述

        每个文档的布局是由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官方文档。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值