问题背景:
在使用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();
推荐阅读
- Qt|Qt常用UI控件读取、写入方法
- Qt|Qt For Android 之启动页
- QT|QT面试
- QT安装
- qt|qt for android实现app内通过按键后台运行程序
- qt|qt for android程序保活 程序后台一直运行不被清理掉(未完)
- QWidget实现手机ipad屏幕滑屏效果
- Qt|Qt官方示例-QML Axes
- 在QT/QML中使用FontAwesome做图标显示
- QT|QtCreator2.7.0桌面快捷方式创建过程