Мне нужен способ перевести размер и размер пикселей между несколькими платформами.Преобразование размера пикселя в размер точки для шрифтов на нескольких платформах
У меня есть приложение Qt, которое должно запускаться на многоплатформенной платформе, включая встроенную Linux на планшет.
Ожидается, что пользователи смогут сохранять файлы, созданные приложением, на рабочем столе (Windows или Linux) и открываться на настраиваемом устройстве.
Данные состоят из чертежей, а текст - QGraphicsItem
s на QGraphicsScene
. Некоторые текстовые элементы представляют собой «богатый текст», поэтому мы можем изменить шрифт на фрагменты текста.
Для обычного текста, включая весь текст пользовательского интерфейса, мы использовали размер пикселя вместо размера точки для достижения аналогичного вида. Но богатый текст бросает вызов мне: QTextCharFormat
не имеет опции pixelSize()
. Только setFontPointSize()
и fontPointSize()
. Я могу использовать font().setPixelSize()
, затем setFont()
, но результат заключается в том, что при сохранении, используя метод html()
, я теряю всю информацию о шрифтах. (Должна быть ошибка qt?)
Итак, мне нужно иметь возможность использовать размер пикселя во всем мире, а затем рассчитать размер точки, чтобы установить его в параграфах (и перейти в обратном порядке при чтении размеров).
Но - Какова связь между размером пикселя и размером точки? Если я определю оба значения для данного шрифта на текущей платформе, могу ли я установить какое-то уравнение для использования?
Редактировать - я нашел интересный пост - он, кажется, делает то, что я хочу, но он специфичен только для OSX. https://stackoverflow.com/a/25929628/1217150
Мои целевые платформы, Windows/Linux/OSX, но также, в частности, пользовательский планшет с встроенным Linux и, возможно, в будущих устройствах Android.
Qt 4.8
Edit - с помощью преобразования в ответ ниже, слева текст с помощью setPixelSize (20) и правый текст, используя setPointSize (20 * screenDpi) где
qreal screenDpi = QApplication::desktop()->physicalDpiX()/72.;
Обратите внимание на размер не то же самое ... (работает в окнах, еще не протестирована на других платформах)
Я даже попытался
#ifdef Q_OS_WIN32
qreal screenDpi = QApplication::desktop()->physicalDpiX()/96.;
#else
qreal screenDpi = QApplication::desktop()->physicalDpiX()/72.;
#endif
пытаются использовать 'setPointSize (20/72 * screenDpi)' где 'qreal screenDpi = QApplication :: рабочий стол() -> logicalDpiX() 'потому что' logicalDpi' и 'physicalDpi' могут быть разными значениями. –