Проводя подробные наблюдения (печатая длинное предложение), можно заметить, что эти пробелы между символами напрямую связаны с самими символами, широкие символы и заглавные буквы поглощают этот пробел (J, s, r, c), а узкие символы оставляют больше разрыв (i, l, t) .. это просто сказать, что это не случайное поведение.
В общем, это известно как кернинг хорошо объяснено здесь . Чтобы минимизировать это, Qt устанавливает кернинг QFont в значение true (по умолчанию) QFont Kerning ... но проблема в том, что кернинг сильно зависит от используемого шрифта и пикселя, и включенный кернинг Qt иногда не действует, как в этот пост , вероятно, потому что установка Кернинг в true
(Будет применен кернинг между соседними символами. Обратите внимание, что OpenType GPOS
основанный кернинг в настоящее время не поддерживается QRawFont :: LayoutFlags
Это означает, что некоторый шрифт Ascent / Descent все равно будет вызывать ограничение на управление зазором.
Ниже рассматриваются два решения, первое из которых по-прежнему придерживается шрифта по умолчанию для рисования, но вы можете растянуть символов, чтобы обеспечить разумную игру:
font.setStretch(70); // value is experimental
Я не думаю, что это надежное решение, если только оно не ограничено использованием определенного шрифта, хотя сам шрифт не важен для печати счетов, второй привлекательный подход - найти лучший шрифт, который соответствует требования: хорошо отображать с заданным разрешением / с небольшими потерями при рисовании в PDF (из Qt) / и, что наиболее важно, эффективно для кернинга!
« MS Gothic » (ttf), например, хорошо работает для такой настройки, вот как она работает (без растяжения)
painter.setFont(QFont("MS Gothic"));
QFont font = painter.font();
int phys_w = printer.width();
font.setPointSizeF((9.0 / phys_w) * 210.0);
//font.setStretch(70);
painter.setFont(font);
Хорошая вещь при выборе подходящего шрифта состоит в том, что возможен больший контроль (особенно для печати счетов-фактур, где мало места).
Например, та же банка может быть напечатана с меньшим пространством на , уменьшая расстояние между буквами :
font.setLetterSpacing(QFont::PercentageSpacing,65); // 65% gap of default
И можно пойти даже на меньший размер шрифта без потери визуального оформления.
делимся ниже некоторыми работами, пытаясь выяснить, как печать шрифта малого размера влияет на разрыв между буквами. идея состоит в том, чтобы нарисовать каждый символ отдельно внутри QRect и одновременно нарисовать эквивалентный QRectF в той же области.
Чтобы увидеть, когда размер шрифта большой, QRectF нарисованы рядом друг с другом, так что также каждый символ ... в то время как при уменьшении размера шрифта смежные QRectF будут сильно перекрываться, и промежутки между символами начинают становиться неупорядоченными.
QPen pen=painter.pen();
pen.setWidth(0.1);
painter.setPen(pen);
QString td("John Doe");
auto spacer = font.pointSizeF(); // font size used to set width of QRect of each character.
spacer *=30.0; // large Rect width.
auto b = 35.0;
for (int i=0; i < td.length() ;i++ )
{
QRectF rectf(b+=spacer,47.0,4.0,4.0);
QRect rect(b, 47.0,4.0,4.0);
QString ch = td.at(i);
//painter.drawText(b+=spacer,46,ch);
painter.drawText(rect,Qt::AlignCenter,ch);
painter.drawRect(rectf);
}
painter.end();
Результат для большого размера шрифта:
Следующее перекрытие QRectF:
spacer *=10.0;
Результат: буквы получают меньше пробелов, а широкие смежные символы - узкие.