本人在开发视频监控客户端时,有个抓图的操作,抓图后,会给出界面提示,界面提示上会显示抓图文件的全路径,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);
最后的效果如下: