WYSIWYG с Qt - горе размера шрифта - PullRequest
3 голосов
/ 29 мая 2010

Я создаю собственный виджет 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.)

РЕДАКТИРОВАТЬ : Оказывается, мой код все-таки работал нормально. Я преобразовал его для работы с принтером, распечатал, а затем напечатал один и тот же текст, используя различные текстовые процессоры, и результаты были точно такими же. Кажется, что запрос размера шрифта не учитывает спуск, и это, кажется, норма.

1 Ответ

1 голос
/ 29 мая 2010

QFont может или не может соответствовать точному шрифту, который вы запрашиваете. QFontMetrics :: height () возвращает размер 284 в моей системе, но QFontInfo :: pixelSize () возвращает размер 254, что и было запрошено. Я предполагаю, что разница в том, что height() включает спуск, где pixelSize() возвращает размер в пикселях сопоставленного шрифта, подразумевая, что у меня было совпадение.

Что касается рисования, размещения и преобразования, вам нужно быть осторожным, поскольку устройство принтера не будет таким же, как устройство экрана, и разрешение не будет совпадать. Чтобы еще больше усугубить проблему, вы не можете получить точные показатели принтера без вызова установки в диалоговом окне печати. Независимость от устройства приближает вас к WYSIWYG, но не всегда достаточно близко.

В вашем примере устройство рисования - this. Таким образом, вы можете получить логическое значение dpi с помощью функций logicDpiX () и logicDpiY () (а также их физических эквивалентов).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...