Qt——QFontMetrics计算字符串宽度那点坑

突然收到测试小姐姐一条消息:有bug,课程名称显示不全,而且也没有“...”。

我:不可能吧,是不是你电脑有问题

测试小姐姐:丢过来一张截图,显示的课程名称确实不全

 

       用相同数据在自己电脑上再次测试了一遍,仍然没有问题。带着疑问去测试那里又看了一遍,果然还是显示不全。查看了下电脑分辨率相关信息,发现“显示大小为100%”,脑袋里突然有了点想法。windows系统提示:修改“显示大小”会更改文本大小。看到这句话突然想到了DPI

 

DPI是什么?

       DPI全称Dots Per Inch(每英寸点数),是一个度量单位。一般来说PDI值越高,每英寸显示点数越多。当分辨率不变,DPI变大时,桌面图标会变大,很多应用软件和字体都会变大。

 

那DPI和课程名称确实不全有什么关系?

看代码:

#include "widget.h"
#include <QLabel>
#include <QFontMetrics>
#include <QFont>
#include <QDebug>

Widget::Widget(QWidget *parent) : QWidget(parent)
{
    QString text = QStringLiteral("一1二2三3asd四【】123五");
    QLabel* label = new QLabel(this);
    label->setFixedSize(100, 24);
    label->setStyleSheet("QLabel{font-size:18px;font-weight:normal;font-style:normal;background-color:red;color:blue;}");
    label->setAlignment(Qt::AlignLeft);
    label->setText(text);
    QFont font(label->font());

    QString tipText = text;
    QString c = QStringLiteral("…");

    QFontMetrics fontMetrics(label->font());
    int textWidth = fontMetrics.width(text);
    int cWidth = fontMetrics.width(c);

    if(textWidth > (label->width() - cWidth))
    {
        text = fontMetrics.elidedText(text, Qt::ElideRight, (label->width() - cWidth));
    }
    label->setText(text);
    label->setToolTip(tipText);
}

Widget::~Widget()
{
}

        通过代码可以发现:QLabel字体大小设置为18px(UI规定:18像素,以下都为18px),然后使用QLabel中的QFont来初始化QFontMetrics对象,来计算字符串大小。

 

当windows显示大小为125%:

当windows显示大小为100%:


切入主题:通过样式表指定文字大小为18px,但是QLabel->font()获取的QFont中像素大小并不是18px,打印结果为-1。

 

找到了问题所在,解决办法就是给QFont设置像素大小为18。

#include "widget.h"
#include <QLabel>
#include <QFontMetrics>
#include <QFont>
#include <QDebug>

Widget::Widget(QWidget *parent) : QWidget(parent)
{
    QString text = QStringLiteral("一1二2三3asd四【】123五");
    QLabel* label = new QLabel(this);
    label->setFixedSize(100, 24);
    label->setStyleSheet("QLabel{font-size:18px;font-weight:normal;font-style:normal;background-color:red;color:blue;}");
    label->setAlignment(Qt::AlignLeft);
    label->setText(text);
    QFont font(label->font());
    font.setPixelSize(18);  //QFont像素大小设置为18,然后再次设置到QLabel中
    label->setFont(font);

    QString tipText = text;
    QString c = QStringLiteral("…");

    QFontMetrics fontMetrics(label->font());
    int textWidth = fontMetrics.width(text);
    int cWidth = 0;

    if(textWidth > (label->width() - cWidth))
    {
        text = fontMetrics.elidedText(text, Qt::ElideRight, (label->width() - cWidth));
    }
    label->setText(text);
    label->setToolTip(tipText);
}

Widget::~Widget()
{
}

经测试在像素大小和字体不变的情况下,修改windows显示大小,课程名称可以正确显示…。

 

小结:

1.在像素大小和字体不变的情况,使用QFontMetrics计算字符串大小时,注意QFont的像素大小是否和字体相同。

2.计算字符串大小除了注意像素,还要注意字体加粗等因素。

 

喜欢的点个关注吧,后续每周都会更新内容

 

  • 9
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值