问题背景:
在使用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源代码以后发现,当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();