10

QPrinterとQPainterを使用して高解像度(1200 dpi)のPDFドキュメントを作成しています。QTextDocument::drawContentsを使用して同じ解像度でテキストを描画しようとしています。QTextDocumentを使用する理由は、ドキュメントに多くのテーブルとフォーマットされたテキストを含める必要があるためです。

私の問題は、QTextDocument :: drawContentsが常に画面解像度(私の場合は96 dpi)でテキストを挿入することです。私がこれまでに見つけたすべての解決策は、正しいサイズを達成するためにテキストをスケーリングすることを提案しています。ただし、これによりテキストの品質が低下し、私には余裕がありません。

私の質問:QTextDocumentのコンテンツを高解像度で描画する方法はありますか?

以下のコードは、2行のテキストを含むPDFファイルを作成します。1つはQPainter :: drawTextを使用して描画され、もう1つはQTextDocument::drawContentsを使用して描画されます。スケーリングに起因する低品質の問題を強調するために、Arial8ptフォントを使用しました。

// 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();
4

1 に答える 1

9

QTextDocumentデフォルトでは画面解像度であるレイアウトに独自のペイントデバイスを使用します 。
次の方法で変更できます。

doc.documentLayout()->setPaintDevice(&printer);
// just before
doc.setPageSize(printer.pageRect().size());
于 2012-04-24T23:00:48.183 に答える