99网
您的当前位置:首页QLabel实现针对纯英文或数字换行

QLabel实现针对纯英文或数字换行

来源:99网

QLabel面对有空格等特殊符号或中文时可以自动换行,只需要设置setWordWrap(true)即可。

当面对没有分隔开的长串英文与数字、英文符号(如 '.'就是英文符号,‘。’就是中文符号)时,QLabel无法自动换行。下面利用QFontMetrics实现换行,该类通过对font属性进行解析,提供指定font下的字符、字符串宽度等获取接口。

按不同字体库有两种情况,一是上述所提字符(统称英文数字符号)的宽度(同一pointSize或pixelSize设置下)都相等,也为我们利用该类手动换行提供了方便;二者就是宽度不一,这个需要修改计算部分代码,但也不难。总体思路就是:获取总长度确定是否换行;获取label宽度能容纳的最长子串;截取字符串并重复上述步骤。下面直接上代码,需要注意原生QLabel为空时会留有一个英文字符的宽度。
方法一:默认英文符号统一宽度,如Consolas字库

ResetText(const QString &text)
{
	if(text.isEmpty()) //待显示字符串为空,返回
	{
		return;
	}
	
	//init
	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(); //待显示字符数
	
	//wordwrap	
	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;
	}
	
	//init
	QString 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(); //字符数
	
	//wordwrap
	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);
}

需要注意:

因篇幅问题不能全部显示,请点此查看更多更全内容