Название: [РЕШЕНО]Изображение в QTextDocument
Отправлено: Larry от Январь 11, 2018, 16:08
Добрый день, форумчане. Мне необходимо распечатать отчеты из таблицы QTableWidget - решил это делать через QTextDocument и QTextTable, но еще необходимо вставить фоновое изображение и здесь возникла проблема - как сделать, чтобы изображение размещалось на всю страницу независимо от его разрешения и размеров? Пробовал так: QPrinter printer(QPrinter::ScreenResolution);
printer.setOutputFormat(QPrinter::PdfFormat); printer.setPaperSize(QPrinter::A4); printer.setOutputFileName("reports/report.pdf");
QTextDocument reportPDF; reportPDF.setPageSize(printer.pageRect().size()); QImage image(":/images/resource/images/background_report.jpg"); QTextCursor cursor(&reportPDF); cursor.movePosition(QTextCursor::Start, QTextCursor::MoveAnchor); cursor.insertImage(image);
reportPDF.print(&printer);
Но в этом случае при сохранении в pdf получается 3 страницы и изображение начинается со второй и затянуто вправо...Как правильно сделать? Спасибо.
Название: Re: Изображение в QTextDocument
Отправлено: Larry от Февраль 15, 2018, 19:00
Оставлю решение, чтобы и самому не забыть :) Сначала страницы формируются с помощью QTextDocument, а потом экспортируются в PDF. QPainter painter(printer);
QSizeF pageSize = printer->pageRect().size();
const qreal footerHeight = painter.fontMetrics().height(); const QRectF textRect(0, 0, pageSize.width(), pageSize.height() - footerHeight);
reportPDF->setPageSize(textRect.size());
const int pageCount = reportPDF->pageCount();
bool firstPage = true; for (int pageIndex = 0; pageIndex < pageCount; ++pageIndex) { if(!firstPage) { printer->newPage(); }
painter.drawImage(textRect, QImage(":/images/resource/images/background_report.png"));
if(pageIndex == 0) { QRectF headerRect = textRect; headerRect.setBottom(textRect.top()); headerRect.setHeight(footerHeight);
painter.drawText(headerRect, Qt::AlignVCenter|Qt::AlignLeft, widget->table()->item(pos.x(), 1)->text() + " - " + widget->table()->item(pos.y(), 1)->text());
painter.drawText(headerRect, Qt::AlignVCenter|Qt::AlignRight, QObject::tr("Страниц: %1").arg(pageCount)); }
painter.save(); const QRectF textPageRect(0, pageIndex*reportPDF->pageSize().height(), reportPDF->pageSize().width(), reportPDF->pageSize().height()); painter.setClipRect(textRect); painter.translate(0, -textPageRect.top()); painter.translate(textRect.left(), textRect.top()); reportPDF->drawContents(&painter); painter.restore();
QRectF footerRect = textRect; footerRect.setTop(textRect.bottom()); footerRect.setHeight(footerHeight);
painter.drawText(footerRect, Qt::AlignVCenter|Qt::AlignLeft, QDate::currentDate().toString("dd.MM.yyyy"));
painter.drawText(footerRect, Qt::AlignVCenter|Qt::AlignRight, QObject::tr("Страница %1 из %2").arg(pageIndex +1 ).arg(pageCount));
emit m_progressbar->increment();
firstPage = false; }
|