2017-02-09 2 views
0

J'ai besoin d'un moyen de traduire la taille des points et la taille des pixels entre plusieurs plates-formes.Convertir la taille de pixel en taille de point pour les polices sur plusieurs plates-formes

J'ai une application Qt qui doit fonctionner sur plusieurs plates-formes, y compris un Linux embarqué sur un type de tablette.
Il est prévu que les utilisateurs puissent enregistrer des fichiers créés par l'application, sur un bureau (Windows ou Linux) et ouverts sur le périphérique personnalisé.

Les données se composent de dessins et du texte - QGraphicsItem sur QGraphicsScene. Certains éléments de texte sont "texte riche", nous pouvons donc changer de police sur des fragments de texte.

Pour le texte normal, y compris tout le texte de l'interface utilisateur, nous avons utilisé la taille de pixel au lieu de la taille de point pour obtenir un aspect similaire. Mais le texte riche me défie: le QTextCharFormat n'a pas une option pixelSize(). Seulement setFontPointSize() et fontPointSize(). Je peux utiliser font().setPixelSize() puis setFont() mais le résultat est que lors de la sauvegarde, en utilisant la méthode html(), je perds toutes les informations de police. (Ce doit être un bug qt?)

Donc, ce dont j'ai besoin est de pouvoir utiliser la taille des pixels partout, puis de calculer la taille du point pour le paramétrer sur les paragraphes (et inverser la lecture des tailles).

Mais - quelle est la relation entre la taille des pixels et la taille des points? Si je détermine les deux, pour une police donnée, sur la plate-forme actuelle, puis-je établir une sorte d'équation à utiliser? Edit - J'ai trouvé un post intéressant - il semble faire ce que je veux, mais il est spécifique à OSX seulement. https://stackoverflow.com/a/25929628/1217150
Mes plates-formes cibles, Windows/Linux/OSX mais aussi, surtout, une tablette personnalisée exécutant Linux embarqué, et éventuellement dans les futurs appareils Android.

Qt 4.8

Modifier - en utilisant la conversion en réponse ci-dessous, le texte à gauche en utilisant setPixelSize (20) et le texte à droite en utilisant setPointSize (20 * screenDPI) où

qreal screenDpi = QApplication::desktop()->physicalDpiX()/72.; 

Notez la taille est pas même ... (en cours d'exécution dans les fenêtres, ne sont pas encore testé sur d'autres plates-formes)

J'ai même essayé

#ifdef Q_OS_WIN32 
    qreal screenDpi = QApplication::desktop()->physicalDpiX()/96.; 
#else 
    qreal screenDpi = QApplication::desktop()->physicalDpiX()/72.; 
#endif 

enter image description here

+0

essayez d'utiliser 'setPointSize (20/72 * screenDPI)' 'où qreal screenDPI = QApplication :: bureau() -> logicalDpiX() 'car' logicalDpi' et 'physicalDpi' peuvent avoir des valeurs différentes. –

Répondre

1

Oui, je pense qu'il est possible:

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

existe-t-il une alternative à 'QGuiApplication'? Je suis limité à Qt 4,8 – Thalia

+0

[ici] http://stackoverflow.com/a/23513221/4810510 est un exemple comment obtenir DPI DPI en utilisant qt 4.8. –

+0

Merci, j'avais trouvé comment aussi ... – Thalia