pointSize - pixelSize

QFont содержит два параметра для размера шрифта pointSize и pixelSize и это уже странно (на первый взгляд).

В теории point это 1\72 дюйма.

Итак на картинке ниже мы видим самое простое приложение для тестирования фонтов с разными pointSize и pixelSize.

Изначально сразу после загрузки приложения так:

фотка 1

Далее мы изменяем размер до 28 и видим, что они выдают разный визуальный результат. В чем дело, кому верить:

фотка 2

Изменяем размер до 8, увеличиваем максимально и видим, что pixel он в и Африке пиксель.

фотка 3

А вот point у нас это что-то побольше.

Еще вариант без сглаживания:

фотка 4

Вывод такой: что похоже pixelSize реальный, то есть в пикселях экрана. Это предположительно видно по минимальным фрагментам.

Теперь берем линейку и измеряем высоту экрана ( у нас 295мм). Разрешение дисплея 1920*1080, то есть 1080 пикселей в высоту.

Делаем шрифт максимальным 99 points (для удобства измерения линейкой на экране), у нас получается по максимальной букве S примерно 35мм (но вроде бы надо еще поля накинуть в реальности).

В одном дюйме 72 пойнтеров. 99pt  делим на 72pt/дюйм получаем 1,375  дюйма, то есть 349мм.

Ну вроде бы сходится. Итак это ровно высота буквы S. 

Правда и буква p тоже такой же высоты.Но  можно заметить, что общая высота  букв p и  S  больше 349мм.

Вывод по-поводу pointSize такой: это реальный размер в мм на вашем экране (дисплее), который прямо линейкой можно замерять.

Для чистоты экперимента запустим прогу на дисплее 1680*1050 (на другом ПК). И увидим, что при установленной высоте 99pt изображение буквы на экране по высоте 350мм. Что и требовалось подтвердить.

То есть надо признать, что размер фонта в пойнтах всегда на разных экранах будет фактически равен, если мерить линейкой по экрану.

Еще получаем важный вывод зачем придумали pointSize: все логично и удобно - чтобы вы могли привязываться к размеру экрана. Например вы хотите, чтобы ваш текст занимал на экране ровно 1см в высоту   по поверхности дисплея.

Еще решили мы выяснить такой момент: какие все-таки поля у наших лэйблов, ведь у фонтов буквы вроде бы не доходят до самого верхнего пикселя и до самого нижнего. И оказалось, что рамка у QLabel показала следующее:

фотка 5

Мы попытались вывести все возможные символы (ради принципа) и посмотрели их максимально верхний пиксел. Оказалось, что он такой же как и буквы большой S. А выше S пустое поле (хотя margin и padding мы убрали в setStyleSheet).

В общем это небольшой не понятный момент. Возможно это расстояние между строками. Делаем wrap слов для лейбла и видим,что очень похоже, что верхний отступ равен расстоянию между строк.

фотка 6
 

Ещё важный на наш взгляд вывод в том, что одновременно использовать pointSize и pixelSize нельзя, так как у них разная логика, разный смысл (хотя технически не запрещено).

И ещё есть интересный нюанс, похоже по умолчанию фонту назначается размер 7,5 pointers, а pixel size равен -1 (то есть не установлен).

Откуда берется размер шрифта по умолчанию

Сразу после старта приложения (у нас Qt 4.8.1, под  Виндоус, размер системного шрифта 125% ) мы имеем по умолчанию такой фонт (нас интерессует 2 и3 параметр, то есть pointSize и pixelSize ,соответственно 7.5 , -1):

app font  QFont( "MS Shell Dlg 2,7.5,-1,5,50,0,0,0,0,0" ) 

То есть pointSize=7.5 pixelSize= -1 (то есть как бы нет).

Причем если мы изменим размер системного шрифта (в Виндоус, сделаем 100%), то у нас в приложении фонт про умолчанию изменится (только надо выйти из учетной записи и войти снова):

app font  QFont( "MS Shell Dlg 2,8.25,-1,5,50,0,0,0,0,0" ) 

При 150%

app font  QFont( "MS Shell Dlg 2,8.25,-1,5,50,0,0,0,0,0" )

И это как бы странновато получается, т.к. 100%=8.25 125%=7,5  150%=8,25.  

Делаем еще замер на при 175%

app font  QFont( "MS Shell Dlg 2,8.25,-1,5,50,0,0,0,0,0" )  после выхода и входа по логину виндоус

Я склонен думать, что 7,5 при 125% это скорее какая-то погрешность.  То есть значение в pt мы будет считать не меняется при изменении размера системного шрифта Виндоус и это логично, так и должно быть. А вот в пикселях конечно же будет меняться.

Надо будет проверить на дисплее с другим разрешением.

А теперь продолжение истории

Прикол в том, что похоже никакой связи нет  между pointSize и pixelSize 

Итак pointSize это просто мм или дюймы (см) не важно, это физический размер на поверхности экрана и он равен константно 1/72 дюйма.

А вот pixelSize это об'ект точка, у которой размер в мм вообще разный бывает.

Так вот размер точки (dot и она же pixel) можно определить только зная размер высоты экрана (физический в мм) и количество пикселей по вертикали (разрешение дисплея по вертикали).

И это в Qt можно получить через класс QDesktopService. Далее мы можем получить QDesktopWidget, это виджет соответствующий нашему экрану дисплея в котором есть и количество пикселей по высоте (height) и размер экрана по вертикали (heighMM) в мм. Вот и все, что надо, чтобы перевести point-ты в pixel-и.

Может возникнуть логичный вопрос - а зачем переводить пойнты в пиксели?... 

Дело в том, что Qt в css стилях pt не понимает (только px). Проверено на версии Qt 4.8.1.

Примечание: в интернете много "странных" утверждений, что pixel это 1/96 дюйма. Так вот это похоже не так, размер пикселя не константный господа.



Файлы для скачивания