Spec-Zone.ru › Qt 5.13

Макеты документов

Макет документа актуален только тогда, когда он должен быть отображен на устройстве или когда запрашивается информация, требующая визуального представления документа. До тех пор, пока это не произойдёт, документ не нужно форматировать и готовить для устройства.

Обзор

Макет каждого документа управляется подклассом класса 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();

Мы создаём макет текста, указывая строку текста, которую хотим отобразить, и шрифт, который нужно использовать. Мы убеждаемся, что предоставленный текст отформатирован правильно, получая строки текста из формата текста и обтекая оставшийся текст с учётом доступного пространства. Строки позиционируются по мере продвижения вниз по странице.

Отформатированный текст может быть нарисован на устройстве отрисовки; в приведённом выше коде текст рисуется непосредственно на виджете.

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.13/richtext-layouts.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API