2016-06-20 1 views
1

Je rencontre des problèmes avec la fonction 'boundingRect' de QFontMetrics, il ne renvoie pas les résultats corrects.QFontMetrics boundingRect

mfntArial = QFont("Arial", 12, QFont::Bold); 
    QFontMetrics objMetrics(mfntArial); 
    QRect rctLine = objMetrics.boundingRect("LOS"); 

Dans le débogueur, rctLine contient:

x1 : 1 
    x2 : 26 
    y1 : -16 
    y2 : 4 

Ceci est très confus, je pense x1 et y1 à la fois être 0 car il n'y a pas de position de référence passé et je me attends à la fois x2 et y2 être positif.

Le rectangle renvoyé n'est pas correct et si je l'utilise avec drawText et l'alignement, une partie de la chaîne est absente de l'affichage.

Je sais qu'il existe d'autres messages sur la façon dont cette fonction retourne les mauvais résultats et j'ai regardé ces derniers, ils ne m'a pas aidé. J'utilise Qt5.6 sur Red Hat 7.2.

J'ai aussi essayé:

QRect rctParent = pobjParent->geometry(); 
    QRect rctLine = objMetrics.boundingRect(rctParent, intAlign, "LOS"); 

Où pobjParent est le widget parent et rctParent contient:

x1 : 8 
    x2 : 289 
    y1 : 24 
    y2 : 447 

intAlign contient 33 (à gauche, en haut)

Dans ce cas rctLine retourne:

x1 : 8 
    x2 : 35 
    y1 : 24 
    y2 : 44 

Mais le rextangle de délimitation est toujours trop petit et une partie du 'S' est manquante lors du rendu.

Official Qt documentation on QFontMetrics

+0

Même problème [ici] (http://stackoverflow.com/questions/27336001/qfontmetrics-returns-inaccurate-results). Documentation [ici] (http://doc.qt.io/qt-4.8/qfontmetrics.html#boundingRect-2). – LogicStuff

Répondre

0

Je fixe mon problème en calculant la largeur de ce que je pense est l'un des personnages les plus larges, « M ».

QRect rctCapM = objMetrics.boundingRect(rctParent, intAlign, "M"); 

J'utilise ensuite cela comme un typique, puis calculer le rectangle de sélection requis pour d'autres chaînes:

QRect rctBounds(0, 0, rctCapM.width() * strLine.length(), rctCapM.height()); 

Où strLine 'contient la chaîne à afficher et calculer les limites pour, cela fonctionne pour moi.