Russian Qt Forum
Июнь 21, 2018, 17:26 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО]Изображение в QTextDocument  (Прочитано 689 раз)
Larry
Программист
*****
Offline Offline

Сообщений: 536



Просмотр профиля
« : Январь 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 страницы и изображение начинается со второй и затянуто вправо...Как правильно сделать?
Спасибо.
« Последнее редактирование: Февраль 15, 2018, 19:00 от Larry » Записан
Larry
Программист
*****
Offline Offline

Сообщений: 536



Просмотр профиля
« Ответ #1 : Февраль 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;
}
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Страница сгенерирована за 0.044 секунд. Запросов: 22.