QTextDocument :: drawContents仅以96 dpi渲染

时间:2012-04-24 14:06:24

标签: c++ qt pdf dpi qtextdocument

我正在使用QPrinter和QPainter创建一个高分辨率(1200 dpi)的PDF文档。我试图使用QTextDocument :: drawContents以相同的分辨率绘制文本。我想使用QTextDocument的原因是因为我需要在我的文档中包含许多表格和格式化文本。

我的问题是QTextDocument :: drawContents总是以屏幕分辨率插入文本,在我的情况下是96 dpi。到目前为止,我找到的所有解决方案都建议缩放文本以达到正确的大小。但是,这导致了低质量的文本,这是我买不起的。

我的问题:有没有办法以高分辨率绘制QTextDocument的内容?

下面的代码创建一个包含2行文本的PDF文件,一行使用QPainter :: drawText绘制,另一行使用QTextDocument :: drawContents绘制。我使用了Arial 8pt字体,以强调缩放产生的低质量问题。

// Read the screen resolution for scaling
QPrinter screenPrinter(QPrinter::ScreenResolution);
int screenResolution = screenPrinter.resolution();

// Setup the font
QFont font;
font.setFamily("Arial");
font.setPointSize(8);

// Define locations to insert text
QPoint textLocation1(20,10);
QPoint textLocation2(20,20);

// Define printer properties
QPrinter printer(QPrinter::HighResolution); 
printer.setOrientation(QPrinter::Portrait);
printer.setPaperSize(QPrinter::A4);
printer.setResolution(1200);
printer.setOutputFormat(QPrinter::PdfFormat);
printer.setOutputFileName("test.pdf");    

// Write text using QPainter::drawText
QPainter painter;
painter.begin(&printer);
painter.setFont(font);
painter.drawText(textLocation1, "QPainter::drawText");

// Write text using QTextDocument::drawContents
QTextDocument doc;
doc.setPageSize(printer.pageRect().size());
QTextCursor cursor(&doc);
QTextCharFormat charFormat;
charFormat.setFont(font);
cursor.insertText("QTextDocument::drawContents", charFormat);
painter.save();
painter.translate(textLocation2);
painter.scale(printer.resolution()/screenResolution, printer.resolution()/screenResolution);
doc.drawContents(&painter);
painter.restore();
painter.end();

1 个答案:

答案 0 :(得分:7)

QTextDocument使用自己的绘图设备进行布局,默认情况下是屏幕分辨率。
您可以通过以下方式进行更改:

doc.documentLayout()->setPaintDevice(&printer);
// just before
doc.setPageSize(printer.pageRect().size());