学习过程中出现的问题|qt QFontMetrics无法返回正确的字符串大小

问题背景:
在使用QFontMetrics时,在网上搜索到一种使用方法是从QPainter对象中获取QFontMetrics对象,然后测量需要生成的文字的宽度和高度。如下:

QFont font; font.setPixelSize(format.textSize); QPainter painter; painter.setFont(font); QFontMetrics fm = painter.fontMetrics(); QRect rect =fm.boundingRect(QRect(), alignmentFlag, text); int width = rect.width(); int height = rect.height();

发现得到的width和height的值均不正确。
解决过程:
尝试发现,当使用QPainter绑定任意大小的QImage以后即可得到正确的文字宽高信息。如下所示
QFont font; font.setPixelSize(format.textSize); QPainter painter; painter.setFont(font); QImage img = QImage(1,1,QImage::Format_RGBA8888_Premultiplied); img.fill(QColor(0, 0, 0, 0)); painter.begin(&img); QFontMetrics fm = painter.fontMetrics(); QRect rect =fm.boundingRect(QRect(), alignmentFlag, text); int width = rect.width(); int height = rect.height();

问题分析:
【学习过程中出现的问题|qt QFontMetrics无法返回正确的字符串大小】观察Qt源代码以后发现,当QPainter未绑定device时,其返回的QFontMetrics是一个设置空QFont对象的对象。如下:
QFontMetrics QPainter::fontMetrics() const { Q_D(const QPainter); if (!d->engine) { qWarning("QPainter::fontMetrics: Painter not active"); return QFontMetrics(QFont()); } return QFontMetrics(d->state->font); }

所以此时相当于并没有设置字体大小,无法正确得到文字大小。
最终解法:
直接定义一个新的QFontMetrics对象,设置其QFont对象,用来得到文字大小。
QFont font; font.setPixelSize(format.textSize); QFontMetrics fm(font); QRect rect =fm.boundingRect(QRect(), alignmentFlag, text); int width = rect.width(); int height = rect.height();


    推荐阅读