Разнообразие шрифтов QT5 на разных платформах

Я хочу сделать репродуктивные тесты некоторых пользовательских визуализаций виджетов. Для этого я рисую их на QImage и сохраняю результат как PNG. На Windows это действительно отличается от MacOSX.

Я позаботился о:

  • Выбор одного и того же шрифта на всей платформе (я предоставляю файл шрифта "TTF" и указываю ему код)
  • Опираясь на QImage, а не на QPixmap, поскольку в документации говорится, что художник QImage должен быть независимым от платформы.
  • Я также выбрал подсказки Antialisating и TextAntialiasing
  • Запрос шрифта через QFontDatabase:: font(), чтобы указать pointSize, а не pixelSize

Как я могу убедиться, что рендеринг точно такой же на всех платформах, чтобы мои тестовые прогоны были воспроизводимыми? Другими словами, возможно ли заставить QT5 использовать один и тот же механизм шрифтов на всех платформах (например, freetype)?

**

Я прикрепил проблему к простой программе тестирования рендеринга. Таким образом, код выглядит следующим образом:

QFontDatabase fontDb;
fontDb.addApplicationFont(".../fonts/Vera.ttf");

QImage   result(width, height, QImage::Format_RGB32);
QPainter painter(&result);
painter.setRenderHint(QPainter::Antialiasing);
painter.setRenderHint(QPainter::TextAntialiasing);


QBrush background(QColor(205, 205, 205));
painter.fillRect(0, 0, 800, 600, background);

QFont font = fontDb.font("Bitstream Vera Sans", "Normal", 10);
painter.setFont(font);

painter.setPen(QColor(0, 0, 0));
painter.drawText(10, 10, "ABCD abcd 01234567");

Шрифт Bitstream Vera можно загрузить, например, на fontsquirel.com.

Посмотрите результат на MacOSX (слева) и на Win32 (справа), которые сильно отличаются:

enter image description here


После ответа и комментариев от N1ghtLight ниже, и после прочтения ссылок, которые он предложил, я изменил код, чтобы получить шрифт:

QFont font = fontDb_->font(("Bitstream Vera Sans", "Normal", -1);

qreal screenDPI  = QApplication::primaryScreen()->physicalDotsPerInch();
qreal RENDER_DPI = 72;

int pixelSize = (int)((qreal)10 * screenDPI / RENDER_DPI);
font.setPixelSize(pixelSize);

Это, по-видимому, в основном решает проблему шрифта самого разного размера. По крайней мере, на MacOSX, шрифт ровно на 10 пикселей. В Windows, хотя шрифт становится намного тоньше и немного меньше. Я все еще потерян и смущен...

Вот новый результат (слева MacOSX, справа Windows). Белая шкала показывает истинный размер 10 пикселей.

enter image description here


После ответа G_G ниже я адаптировал код (как насчет Linux? Мобильные платформы? Это очень сложно...). Теперь шрифты составляют 10 пикселей на выходе как на Windows, так и на MacOSX, но различие все еще отличается (все еще MacOSX слева, Windows справа).

enter image description here

Спасибо.

Ответы

Ответ 1

ваша переменная DPI для визуализации должна быть 96 для Windows и 72 для OSX

в соответствии с: http://www.rfwilmut.clara.net/about/fonts.html

На мониторе Macintosh условное разрешение составляет 72 точки на дюйм (dpi), так что графическая ширина 72 пикселя, предположительно, будет 1 дюйм широкий, хотя, очевидно, фактический размер будет зависеть от индивидуального монитор. Однако он всегда будет печатать один дюйм шириной.

Но на мониторе Windows разрешение (обычно) составляет 96 точек на дюйм. Эта означает, что хотя изображение все еще имеет ширину 72 пикселя, оно будет печатать при 0,75 дюйма.

QFont font = fontDb_->font(("Bitstream Vera Sans", "Normal", -1);
qreal screenDPI  = QApplication::primaryScreen()->physicalDotsPerInch();

#ifdef WINDOWS
qreal RENDER_DPI = 96;
#else
qreal RENDER_DPI = 72;
#endif

int pixelSize = (int)((qreal)10 * screenDPI / RENDER_DPI);
font.setPixelSize(pixelSize);

Ответ 2

Это происходит потому, что вы задаете размер в пикселях. Вместо этого вам нужно использовать setPointSize().

Из документов Qt 5:

void QFont::setPixelSize(int pixelSize)

Устанавливает размер шрифта в пиксельные пиксели. Использование этой функции делает устройство шрифта зависимым. Используйте setPointSize() или setPointSizeF(), чтобы установить размер шрифта независимо от устройства.

Кроме того, для получения дополнительной информации вы можете проверить этот пост. Это различие происходит из-за различной плотности отображения на разных ОС. Я сам столкнулся с такой проблемой на одном OS X, проекте кросс-платформы Windows.


[Обновлено] После моих дополнительных исследований я обнаружил, что текущее поведение шрифтов Qt - это просто ошибка. То почему решение выше не работает (оно работало для Qt 4) Здесь описаны различные способы решения этой проблемы. Удачи!

Ответ 3

Вы можете попробовать это. это создаст изображение с текстом, который вы напишете. Я использую этот код.

QPixmap photo;
QFont qfont;
QPainter painter;
QString txt;

QImage img(x,y,QImage::Format_RGB32);

painter.begin(&img);
img.fill(0xffffffff);
painter.drawPixmap(0,0,x,y,photo);

qfont.setFamily("Sampige");
qfont.setPixelSize(28);
painter.setFont(qfont);
txt = QString::fromUtf8("ನಮಸ್ಕಾರ");
painter.drawText(1,26,txt);
painter.end();
img.save("abcd.jpg");