突然收到测试小姐姐一条消息:有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.计算字符串大小除了注意像素,还要注意字体加粗等因素。
喜欢的点个关注吧,后续每周都会更新内容