Important: Please read the Qt Code of Conduct -

Get error messages when using QPrinter, QPainter and QTextDocument together

  • In my Qt application, I want to create a preview page with the content that contains the Header, Footer title and a TableView.

    This is the code I used:

    void MainWindow::print(QPrinter *printer)
    int xscale = 50;
    int yscale = 30;

    QPoint top_left = QPoint(xscale, yscale);
    QPoint top_right = QPoint(xscale + 552, yscale + 20);
    QPoint bottom_left = QPoint(xscale, yscale + 1020);
    QPoint bottom_right = QPoint(xscale + 492, yscale + 1020);
    QPainter painter(printer);
    painter.setRenderHints(QPainter::Antialiasing |
                           QPainter::TextAntialiasing |
                           QPainter::SmoothPixmapTransform, true);
    // Header
    painter.setFont(QFont("Arial", 10));
    painter.drawImage(top_left, QImage(":/images/images/logo.png"));
    painter.drawText(top_right, "Header");
    // Print the Table
    QString strStream;
    QTextStream out(&strStream);
    out << "&lt;html&gt;\n"
      "&lt;meta content=\"text/html; charset=utf-8\"&gt;\n"
      "&lt;title&gt;Demo MyTableView&lt;/title&gt;\n"
      "&lt;style tyle=\"text/css\"&gt;th{font-size: 14pt}\n td{font-size: 12pt}\n table td + td + td + td{font-weight:bold}&lt;/style&gt;"
     "&lt;body bgcolor=#ffffff link=#5000A0&gt;\n"
      "<table cellspacing=\"0\" cellpadding=\"2\" border=\"1\" width=\"100%\">\n";
    // Print the headers
    out << "<thead><tr bgcolor=\"#ffffff\">";
    for (int column = 0; column < columnCount; column++)
        if (!myTableView->isColumnHidden(column))
            out << QString("<th>%1</th>").arg(myTableView->model()->headerData(column, Qt::Horizontal).toString());
    out << "</tr></thead>\n";
    // Print the data
    for (int row = 0; row < rowCount; row++) {
        out << "<tr>";
        for (int column = 0; column < columnCount; column++) {
            if (!myTableView->isColumnHidden(column)) {
                QString data = myTableView->model()->data(myTableView->model()->index(row, column)).toString().simplified();
                out << QString("<td bkcolor=0 align=center>%1</td>").arg((!data.isEmpty()) ? data : QString("&nbsp;"));
        out << "</tr>\n";
    out <<  "</table>\n"


    QTextDocument *document = new QTextDocument();
    document->print(printer);  // I got the error messages at here
    delete document;
    // Footer
    painter.setFont(QFont("Arial", 10));
    painter.drawText(bottom_left, "Copyright 2013");
    // Get current date and time
    QDateTime dateTime = QDateTime::currentDateTime();
    QString dateTimeString = dateTime.toString();
    painter.drawText(bottom_right, dateTimeString);


    When I run the application, I only see Header and Footer title in the preview page, the TableView is not shown. Then I used qDebug() to check and I got the error messages

    QPrinter::setDocName: Cannot be changed while printer is active
    QPainter::begin: A paint device can only be painted by one painter at a time.

    at the line

    @document->print(printer); @

    How can I solve this issue to print the data normally with the Header, Footer title and TableView?

    Thanks for your help!

  • The painter is already using the printer, so you can't use it until you end the painting with it. I would try it with drawStaticText. QStaticText should be able to draw html.

Log in to reply