Я создаю собственный виджет Qt, который имитирует печатную страницу формата А4, и у меня возникают проблемы с получением шрифтов для отображения в правильном размере. Мой виджет использует QPainter::setViewport
и QPainter::setWindow
для имитации страницы А4, используя единицы десятых миллиметра, что позволяет мне легко рисовать. Однако попытка создать шрифт с определенным размером точки не работает, и использование QFont:setPixelSize
не является точным. Вот некоторый код:
View::View(QWidget *parent) :
QWidget(parent),
printer(new QPrinter)
{
printer->setPaperSize(QPrinter::A4);
printer->setFullPage(true);
}
void View::paintEvent(QPaintEvent*)
{
QPainter painter(this);
painter.setWindow(0, 0, 2100, 2970);
painter.setViewport(0, 0, printer->width(), printer->height());
// Draw a rect at x = 1cm, y = 1cm, 6cm wide and 1 inch high
painter.drawRect(100, 100, 600, 254);
// Create a 72pt (1 inch) high font
QFont font("Arial");
font.setPixelSize(254);
painter.setFont(font);
// Draw in the same box
// The font is too large
painter.drawText(QRect(100, 100, 600, 254), tr("Wg\u0102"));
// Ack - the actual font size reported by the metrics is 283 pixels!
const QFontMetrics fontMetrics = painter.fontMetrics();
qDebug() << "Font height = " << fontMetrics.height();
}
Таким образом, я запрашиваю шрифт высотой 254 (1 дюйм, 72 точки), и он слишком большой и достаточно уверенный, когда я запрашиваю высоту шрифта через QFontMetrics
, это высота 283.
Кто-нибудь еще знает, как использовать размеры шрифта в точках при использовании пользовательских режимов отображения, подобных этому? Это должно быть возможно. Обратите внимание, что я также не вижу, как преобразовать между логическими точками / точками устройства (то есть эквивалентами Win32 DPtoLP
/ LPtoDP
.)
РЕДАКТИРОВАТЬ : Оказывается, мой код все-таки работал нормально. Я преобразовал его для работы с принтером, распечатал, а затем напечатал один и тот же текст, используя различные текстовые процессоры, и результаты были точно такими же. Кажется, что запрос размера шрифта не учитывает спуск, и это, кажется, норма.