1.简述
遇到一个问题是QLabel显示文件名称不完整,
QLabel支持的setWordWrap(); 只会根据单词断行,
没有单词的就换不了;
手动实现一个,可指定最多显示行数。
以下分别是1,2,3行的显示效果
2.测试例子
m_pLabelName = new QLabel(this);
m_pLabelName->adjustSize();
QString strSrcName = "124532002156436230.34654536.png"
QString strElidedText = elidedLineText(m_pLabelName,2,strSrcName); //指定最多显示2行
m_pLabelName->setText(strElidedText);
3.函数实现代码
QString elidedLineText(QWidget *pWidget, int nLine, QString strText)
{
if(nLine == 0)
return "";
QFontMetrics fontMetrics(pWidget->font());
if(nLine == 1){
return fontMetrics.elidedText(strText,Qt::ElideMiddle,pWidget->width()/2);
}
QStringList strListLine;
//满行的都加进列表
for(int i = 0; i < strText.size(); i++){
if(fontMetrics.width(strText.left(i)) >= pWidget->width()/2){ //不知为何除2才显示正常
strListLine.append(strText.left(i));
strText = strText.right(strText.size() - i);
i = 0;
}
}
//最后不足一行的也加进去
if(!strText.isEmpty()){
strListLine.append(strText);
}
//超过指定行数 从倒数第二行开始删除
bool bHasElided = false; //标记是否有省略内容
while(strListLine.count() > nLine){
if(strListLine.count() >= 2){
strListLine.removeAt(strListLine.count()-2);
bHasElided = true;
}
}
//最后一行加了...超行 就从省略号后开始删除字符 直到不超为止
if(bHasElided && !strListLine.isEmpty()){
QString strLast = strListLine.last();
QString strElided = "...";
strLast.insert(0,strElided);
while(fontMetrics.width(strLast) >= pWidget->width()/2){
strLast = strLast.replace(strElided.size(),1,"");
}
strListLine.replace(strListLine.count() - 1,strLast);
}
QString strResult = strListLine.join("\n");
return strResult;
}