我想打印一个带有页眉和页脚的QWebView 。我正在使用QPrintPreviewDialog类来预览打印。我看到了项目phantomjs和wkhtmltopdf如何解决这个问题,但在我的项目中包含 WebKit 的修改版本似乎有点过分。显然用 Qt 和 Webkit 打印页眉和页脚,这是一个没有彻底解决的问题:
- https://bugs.webkit.org/show_bug.cgi?id=30357
- https://bugreports.qt.io/browse/QTBUG-29619
- https://wiki.qt.io/Qt_project_org_faq(问题 229)
先验我不知道我要打印多少页。目前我正在继承QPrinter并重新实现newPage()方法。这是一个可怕的黑客,但几乎可以工作。我面临的问题是它在 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));
}
编辑(基于 Kuba Ober 的回答):使用 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