У меня проблемы с функцией QFontMetrics ‘boundingRect’, она не возвращает правильные результаты.
mfntArial = QFont("Arial", 12, QFont::Bold);
QFontMetrics objMetrics(mfntArial);
QRect rctLine = objMetrics.boundingRect("LOS");
В отладчике rctLine содержит:
x1 : 1
x2 : 26
y1 : -16
y2 : 4
Это очень сбивает с толку, я ожидаю, что x1 и y1 будут равны 0, так как не пройдена контрольная позиция, и я ожидаю, что x2 и y2 будут положительными.
Возвращенный прямоугольник неверен, и если я использую его с drawText и выравниванием, то часть строки будет отсутствовать на дисплее.
Я знаю, что есть другие сообщения о том, как эта функция возвращает неправильные результаты, и я смотрел на них, они не помогли мне.
Я использую Qt5.6 на RedHat 7.2.
Я также попробовал:
QRect rctParent = pobjParent->geometry();
QRect rctLine = objMetrics.boundingRect(rctParent, intAlign, "LOS");
Где pobjParent — родительский виджет, а rctParent содержит:
x1 : 8
x2 : 289
y1 : 24
y2 : 447
intAlign содержит 33 (слева вверху)
В этом случае rctLine возвращает:
x1 : 8
x2 : 35
y1 : 24
y2 : 44
Но ограничивающий прямоугольник все еще мал, и часть ‘S’ отсутствует при визуализации.
Я исправил свою проблему, рассчитав ширину одного из самых широких символов «М».
QRect rctCapM = objMetrics.boundingRect(rctParent, intAlign, "M");
Затем я использую это как типичный и затем вычисляю требуемый ограничивающий прямоугольник для других строк:
QRect rctBounds(0, 0, rctCapM.width() * strLine.length(), rctCapM.height());
Где ‘strLine’ содержит строку для отображения и вычисления границ, это работает для меня.
Других решений пока нет …