Я хочу напечатать QWebView с заголовком и нижним колонтитулом. Я использую класс QPrintPreviewDialog для предварительного просмотра печати.
Я видел, как решить эту проблему проекты phantomjs а также wkhtmltopdf но кажется немного чрезмерной необходимость включать в мой проект модифицированную версию WebKit.
Судя по всему, печать верхних и нижних колонтитулов с помощью Qt и Webkit — это проблема, которая не была полностью решена:
Априори я не знаю, сколько страниц я собираюсь напечатать. В настоящее время я подкласс QPrinter и переопределение новая страница() метод. Это ужасный взлом, но почти работает. Проблема, с которой я сталкиваюсь, заключается в том, что все, что печатается за пределами pageRect, отображается размытым. Эффект водяного знака присутствует только в предварительном просмотре, а не в напечатанном результате, но низкое качество присутствует всегда.
Есть что-то, что я могу сделать, чтобы печатать заголовки лучшего качества, не привлекая весь WebKit в мой проект?
Я подозреваю, что разница заключается в том, что я использую QWebView :: render вместо QWebView :: print. QCustomPrinter имеет связанный QPainter перед печатью заголовка (QPainter, связанный, когда содержимое было напечатано). Поэтому я не могу вызвать QWebVieww: print при печати заголовков, потому что этот метод пытается связать новый QPainter с QPrinter.
void CustomPrinter::printHeader()
{
QPainter & painter =*this->paintEngine()->painter();
QWebView v;
v.setContent("<html> ""<body>"" asdadasdasdasd ""</body>""</html>");
v.setFixedSize(this->pageRect().size());
v.render(&painter,QPoint(0,- 95),QRegion(0,0,this->pageRect().width(),95));
}
РЕДАКТИРОВАТЬ (на основе ответа Куба Обер):
Использование QTextDocument вместо QWebView решает проблему качества.
void CustomPrinter::printHeader()
{
QPainter * painter =p->paintEngine()->painter();
painter->save();
QTextDocument v;
v.setHtml(QString::fromStdString(_impresion.cabecera()));
QRectF r =this->pageRect();
r.moveTo(0,0);
r.setHeight(95);
painter->translate(0,-95);
v.drawContents(painter,r);
painter->restore();
}
Я поделюсь минимальным примером того, о чем я говорю. Класс CustomPrinter печатает заголовок.
https://www.dropbox.com/s/2vifzk8rs6scrx5/stackExample.tar.gz?dl=0
Задача ещё не решена.