Important: Please read the Qt Code of Conduct -

Exact page layout with rich text

  • I need to generate some documents that have very precise layout. One is an invoice with a tear-off section that needs to have the addresses exactly where they need to be to be in the envelope windows. I also want to have sections of the page be rich text (multiple paragraphs in particular parts of the page).

    It seems I can ALMOST do this with QTextLayout, but it is painful to have (for example) a single bold word in a paragraph. I have tried using QTextDocument, but I can not find a way to put the document on a section of the page (and another on another section...).

    Is there not a way to have a few paragraphs of rich text laid out within a particular rectangle and placed on a page in a particular place? I can make a QTextLayout drop anywhere on a page, but I see no way to specify the beginning of a QTextDocument. I'm starting to think there isn't a way to do this easily.

    Here's some code I was playing with. Some direction would be great! Thanks for your time.

    @#include <QApplication>
    #include <QTextStream>

    #include <QFont>
    #include <QFontMetrics>
    #include <QPrinter>
    #include <QPainter>
    #include <QTextLayout>
    #include <QTextDocument>

    int main(int argc, char *argv[])
    QApplication app(argc, argv);

    QFont font("DejaVu Sans", 10, QFont::Normal, false);
    QPrinter printer(QPrinter::HighResolution);
    QPainter painter;
    QFont paintFont(font, &printer);
    QFontMetrics fontMetrics(paintFont);
    int leading = fontMetrics.leading();
    qreal height = 0;
    QTextLayout textLayout("This is some text to be laid out.", paintFont);
    while (1) {
        QTextLine line = textLayout.createLine();
        if (!line.isValid())
        height += leading;
        line.setPosition(QPointF(0, height));
        height += line.height();
    QTextDocument textPanel;
    textPanel.setPlainText("This is a larger chunk of text that should be turned into a nice paragraph or two at the right hand side of our first page.  However, despite reports that it can be done, I can't seem to figure out how to get a QTextDocument to display at a particular location on a page.  What gives?");
    textLayout.draw(&painter, QPoint(600, 600));
    //painter.translate(QPoint(100, 100));
    textPanel.drawContents(&painter, QRectF(100, 100, 4800, 6000));


  • HTML (on which the [[Doc:QTextDocument]] based classes rely on) are very hard to make pixel precise - if not impossible. In that case I personally would go with a QPainter and draw the contents directly. That way you have exact control over where your data is printed.

Log in to reply