QLabel面对有空格等特殊符号或中文时可以自动换行,只需要设置setWordWrap(true)即可。
当面对没有分隔开的长串英文与数字、英文符号(如 '.'就是英文符号,‘。’就是中文符号)时,QLabel无法自动换行。下面利用QFontMetrics实现换行,该类通过对font属性进行解析,提供指定font下的字符、字符串宽度等获取接口。
按不同字体库有两种情况,一是上述所提字符(统称英文数字符号)的宽度(同一pointSize或pixelSize设置下)都相等,也为我们利用该类手动换行提供了方便;二者就是宽度不一,这个需要修改计算部分代码,但也不难。总体思路就是:获取总长度确定是否换行;获取label宽度能容纳的最长子串;截取字符串并重复上述步骤。下面直接上代码,需要注意原生QLabel为空时会留有一个英文字符的宽度。
方法一:默认英文符号统一宽度,如Consolas字库
ResetText(const QString &text)
{if(text.isEmpty()) //待显示字符串为空,返回{return;}//initQString 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(); //待显示字符数//wordwrap QString temp;while(nMax < nCount) //不是最后一行{temp = target.left(nMax);temp.append("n");res.append(temp);ve(0, nMax);nCount = nCount - nMax;}res.append(target);ui->label->setText(res);
}
方法二:其他情况,如微软雅黑字库
ResetText(const QString &text)
{if(text.isEmpty()){return;}//initQString res; //存结果QString target = text; //便于截取待显示字符串QFontMetrics fm(ui->label->font());int nWidth = ui->label->width() - fm.horizontalAdvance('x'); //最大容纳字符宽度,若设置左右padding也需减去int nLength = fm.horizontalAdvance(text); //字符总长度int nCount = text.size(); //字符数//wordwrapwhile(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);ve(0, n);nCount = nCount - n;nLength = fm.horizontalAdvance(target);}res.append(target);ui->label->setText(res);
}
需要注意:
本文发布于:2024-02-04 22:03:28,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170717420760005.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |