Sur cette page

Mise en page des documents

La mise en page d’un document n’est pertinente que lorsqu’il doit être affiché sur un périphérique, ou lorsqu’une information est demandée qui nécessite une représentation visuelle du document. Tant que cela ne se produit pas, le document n’a pas besoin d’être mis en forme ni préparé pour un périphérique.

Présentation

La mise en page de chaque document est gérée par une sous-classe de la classe ` QAbstractTextDocumentLayout `. Cette classe fournit une interface commune pour les moteurs de mise en page et de rendu. Le comportement de rendu par défaut est actuellement implémenté dans une classe privée. Cette approche permet de créer des mises en page personnalisées et fournit le mécanisme utilisé lors de la préparation des pages pour l'impression ou l'exportation vers des fichiers au format PDF (Portable Document Format).

Exemple — Mise en page de texte profilé

Il est parfois important de pouvoir mettre en forme du texte brut au sein d’une zone de forme irrégulière, par exemple lors du rendu d’un widget personnalisé. Scribe fournit des fonctionnalités génériques, telles que celles offertes par la classe ` QTextLayout `, pour aider les développeurs à effectuer des tâches de retour à la ligne et de mise en page sans avoir à créer de document au préalable.

Capture d'écran d'un texte qui s'enroule autour d'un cercle.

La mise en forme et le tracé d’un paragraphe de texte brut sont très simples. L’exemple ci-dessous mettra en page un paragraphe de texte, en utilisant une seule police, le long du bord droit d’un cercle.

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

Nous créons une mise en page de texte, en spécifiant la chaîne de caractères que nous souhaitons afficher et la police à utiliser. Nous nous assurons que le texte fourni est correctement formaté en récupérant les lignes de texte à partir du format de texte, puis en effectuant le retour à la ligne du texte restant en fonction de l’espace disponible. Les lignes sont positionnées au fur et à mesure que nous descendons dans la page.

Le texte formaté peut être affiché sur un périphérique de dessin ; dans le code ci-dessus, le texte est affiché directement sur un widget.

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.