Qt中QLabel字符串多行展示,且最后显示不下的用...代替

本人在开发视频监控客户端时,有个抓图的操作,抓图后,会给出界面提示,界面提示上会显示抓图文件的全路径,UI设计此路径分两行展示,如果路径太长,两行不足以显示,则最后显示不下的用…代替。
如下代码中,路径可以分多行展示,但是这个行会被单词断开。比如第一行learn后面还可以展示一些路径,但是却没法展示。

	ui.setupUi(this);
	QString strText = "E:/learn/cef_binary_75.0.1+gb5e74dd+chromium-75.0.3770.80_windows32/libcef_dll/cpptoc";
	ui.label->setWordWrap(true);
	QFontMetrics fontWidth(ui.label->font());//得到每个字符的宽度
	QString elideNote = fontWidth.elidedText(strText, Qt::ElideRight, ui.label->width() * 2);
	ui.label->setText(elideNote);

在这里插入图片描述

所以最好能够自己实现,废话不说,直接上代码

QString elidedLineText(QWidget *pWidget, int nLine, QString strText)
{
    
    
	if (nLine == 0)
		return "";

	QFontMetrics fontMetrics(pWidget->font());

	if (nLine == 1) {
    
    
		return fontMetrics.elidedText(strText, Qt::ElideRight, pWidget->width());
	}

	QStringList strListLine;

	for (int i = 0; i < strText.size(); i++)
	{
    
    
		if (fontMetrics.width(strText.left(i)) >= pWidget->width()) 
		{
    
    
			strListLine.append(strText.left(i));
			if (strListLine.size() == nLine)
			{
    
    
				break;
			}
			strText = strText.right(strText.size() - i);
			i = 0;
		}
	}
	
	if (strListLine.size() < nLine)
	{
    
    
		if (!strText.isEmpty()) {
    
    
			strListLine.append(strText);
		}
	}

	bool bHasElided = true;
	if (fontMetrics.width(strText) < pWidget->width())
	{
    
    
		bHasElided = false;
	}

	if (bHasElided && !strListLine.isEmpty()) 
	{
    
    
		QString strLast = strListLine.last();
		QString strElided = "...";
		strLast.insert(strLast.length(), strElided);
		while (fontMetrics.width(strLast) >= pWidget->width()) 
		{
    
    
			strLast = strLast.replace(0, 1, "");
		}

		strListLine.replace(strListLine.count() - 1, strLast);
	}
	QString strResult = strListLine.join("\n");

	return strResult;
}

而调用这段进行处理的代码如下:

	ui.setupUi(this);
	QString strText = "E:/learn/cef_binary_75.0.1+gb5e74dd+chromium-75.0.3770.80_windows32/libcef_dll/cpptoc";
	
	QFont font;
	font.setFamily("NSimSun");
	font.setPointSize(9);
	ui.label->setFont(font);
	QString strElidedText = elidedLineText(ui.label, 2, strText); //指定最多显示2行
	ui.label->setText(strElidedText);

最后的效果如下:
在这里插入图片描述

Guess you like

Origin blog.csdn.net/tusong86/article/details/114183474