QLabel面对有空格等特殊符号或中文时可以自动换行,只需要设置setWordWrap(true)即可。
当面对没有分隔开的长串英文与数字、英文符号(如 '.'就是英文符号,‘。’就是中文符号)时,QLabel无法自动换行。下面利用QFontMetrics实现换行,该类通过对font属性进行解析,提供指定font下的字符、字符串宽度等获取接口。
按不同字体库有两种情况,一是上述所提字符(统称英文数字符号)的宽度(同一pointSize或pixelSize设置下)都相等,也为我们利用该类手动换行提供了方便;二者就是宽度不一,这个需要修改计算部分代码,但也不难。总体思路就是:获取总长度确定是否换行;获取label宽度能容纳的最长子串;截取字符串并重复上述步骤。下面直接上代码,需要注意原生QLabel为空时会留有一个英文字符的宽度。
方法一:默认英文符号统一宽度,如Consolas字库
ResetText(const QString &text)
{
if(text.isEmpty())
{
return;
}
QString res;
QString target = text;
QFontMetrics fm(ui->label->font());
int nWidth = ui->label->width() - fm.horizontalAdvance('x');
int nMax = nWidth / fm.horizontalAdvance('x');
int nCount = text.size();
QString temp;
while(nMax < nCount)
{
temp = target.left(nMax);
temp.append("\n");
res.append(temp);
target.remove(0, nMax);
nCount = nCount - nMax;
}
res.append(target);
ui->label->setText(res);
}
方法二:其他情况,如微软雅黑字库
ResetText(const QString &text)
{
if(text.isEmpty())
{
return;
}
QString res;
QString target = text;
QFontMetrics fm(ui->label->font());
int nWidth = ui->label->width() - fm.horizontalAdvance('x');
int nLength = fm.horizontalAdvance(text);
int nCount = text.size();
while(nWidth < nLength)
{
int n = (nWidth / (qreal)nLength) * nCount;
QString temp = target.left(n);
while(fm.horizontalAdvance(temp) <= nWidth)
{
n++;
temp = target.left(n);
}
while(fm.horizontalAdvance(temp) > nWidth)
{
n--;
temp = target.left(n);
}
temp.append("\n");
res.append(temp);
target.remove(0, n);
nCount = nCount - n;
nLength = fm.horizontalAdvance(target);
}
res.append(target);
ui->label->setText(res);
}
需要注意: