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源代码以后发现,当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,QFontMetrics)