QTextDocument::drawContents отображается только с разрешением 96 dpi
Я создаю PDF-документ с высоким разрешением (1200 точек на дюйм), используя QPrinter и QPainter. Я пытаюсь нарисовать текст в том же разрешении, используя QTextDocument::drawContents. Причина, по которой я хочу использовать QTextDocument, заключается в том, что мне нужно включить много таблиц и форматированного текста в мой документ.
Моя проблема в том, что QTextDocument:: drawContents всегда вставляет текст с разрешением экрана, которое в моем случае составляет 96 dpi. Все решения, которые я нашел до сих пор, предполагают масштабирование текста для достижения правильного размера. Однако это приводит к низкому качеству текста, который я не могу себе позволить.
Мой вопрос: есть ли способ нарисовать содержимое QTextDocument в высоком разрешении?
Приведенный ниже код создает файл PDF с 2 строками текста, одна нарисована с использованием 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 ответ
QTextDocument
использовать собственное устройство рисования для макета, который по умолчанию с разрешением экрана.
Вы можете изменить это с помощью:
doc.documentLayout()->setPaintDevice(&printer);
// just before
doc.setPageSize(printer.pageRect().size());