2017-02-09 3 views
0

Мне нужен способ перевести размер и размер пикселей между несколькими платформами.Преобразование размера пикселя в размер точки для шрифтов на нескольких платформах

У меня есть приложение 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 

enter image description here

+0

пытаются использовать 'setPointSize (20/72 * screenDpi)' где 'qreal screenDpi = QApplication :: рабочий стол() -> logicalDpiX() 'потому что' logicalDpi' и 'physicalDpi' могут быть разными значениями. –

ответ

1

Да, я думаю, что это возможно:

double ptToPx(double pt, double dpi) { 
    return pt/72*dpi 
} 

double pxToPt(double px, double dpi) { 
    return px*72/dpi 
} 

... 

double dpi = QGuiApplication::primaryScreen()->physicalDotsPerInch(); 
qDebug() << "12 pt is" << ptToPx(12, dpi) << "px"; 
qDebug() << "26 px is" << pxToPt(26, dpi) << "pt"; 
+0

есть ли альтернатива 'QGuiApplication'? Я ограничен Qt 4.8 – Thalia

+0

[Здесь] http://stackoverflow.com/a/23513221/4810510 - пример того, как получить логический ДОИ с использованием qt 4.8. –

+0

Спасибо, я нашел, как и ... – Thalia

Смежные вопросы