过长的字符不换行,一个中文等于两个字符长。
1.纯字符换行,计算最大长度有多少个字符,text插入换行符
QString SuwellMessageBox::AutoFeed(QString text, int width) //text仅允许半角
{
QString strText = text;
QString str ;
int count=0; //每行字符个数
while(TextLabel->fontMetrics().boundingRect(str).width()<width)
{
str.append(text[count++]);
}
int AntoIndex = 1; //半角宽度
if(!strText.isEmpty())
{
for(int i = 1;i<strText.size() + 1;i++)
{
if(i == (count-1)*AntoIndex + AntoIndex -1)
{
strText.insert(i,"\n");
AntoIndex ++;
}
}
}
return strText;
}
2. 中英文混合输入换行,计算每个字符长度,逐个添加
QFontMetrics font(TextLabel->font());
TextLabel->setText(SpliteText(font, text, maxW_Label));
QString SuwellMessageBox::SpliteText(const QFontMetrics& font, const QString& text, int nLabelSize)
{
int nTextSize = font.width(text);
if(nTextSize > nLabelSize){
int nPos = 0;
long nOffset = 0;
for (int i = 0; i < text.size(); i++){
nOffset += font.width(text.at(i));
if(nOffset >= nLabelSize){
nPos = i;
break;
}
}
nPos = (nPos -1 < 0) ? 0 : nPos -1;//zr.主要是为了防止截取字符串的位置是-1.回退一个字节的作用是换行,防止字符有一半显示一半未显示
QString qstrLeftData = text.left(nPos);
QString qstrMidData = text.mid(nPos);
return qstrLeftData + "\n" + SpliteText(font, qstrMidData, nLabelSize);
}
return text;
}