一、应用场景简述
当在有限宽度的QLable中显示很长的文件名/字符串时,超出QLabel宽度部分将不会显示,此时采取缩短文件名策略(也可实现为字符串滚动动画)可以缓解这一问题。在实现这一想法的过程中,先后提出两个解决方案。遂再次分享给大家。
二、方案实现
//方案1:简单的保留前面几个字符,去出中间的几个字符,保留后面几个字符
QString scalText(QString org)
{
QString result;
const quint16 strLen = org.length();
int index = org.lastIndexOf(".");
if(-1 == index){ //如果返回-1表示没找到
//无后缀名
QString fileName = org;
if( strLen < 11)
result = fileName;
else{
result = fileName.mid(0,3); //取前三个字符
result += "...";
result = fileName.mid(strLen-6,6); //取后6个字符
}
}
else{
//有后缀名
if( strLen < 11){
result = org;
}
else{
const QString fileName = org.left(index); //文件名
const quint16 fileNameLen = fileName.length();
const QString fileExtName = org.right(strLen - 1 - org.lastIndexOf(".")); //文件扩展名
result = fileName.mid(0,3);
result += "..." + fileName.mid(fileNameLen-3,3); //取后3个字符
result += "." + fileExtName; //追加后缀名
}
}
return result;
}
此实现方案灵活性差,通用性差,而且在文件名/字符串中混合这ASCII码和宽字符时显示效果极差。
//方案2:根据QLabel的实际宽度、字体的尺寸属性等对文件名进行缩短
//目标: 将“长文件名测试文件-长文件名测试文件-长文件名测试文件.wmv 1203MB”缩短为“长文件名...测试文件.wmv 1203MB”
//定义: QString scalText(QString org, unsigned int showWidth ,QString arg1="");
//参数:org-待缩短的字符串/文件名,如上面的“长文件名测试文件-长文件名测试文件-长文件名测试文件.wmv”
// showWidht-QLabel的实际宽度
// arg1-追加到org后面的补充字符串
QString scalText(QString org, unsigned int showWidth ,QString arg1)
{
QString result;
QString chngeStr("...");
QFontMetrics fm(QFont("微软雅黑",10));
const unsigned int labWidthPxs = showWidth-10; //label的固定宽度
int textWidthInPxs = fm.width(org);
int unitsWidthPxs = fm.width(arg1);
int blankWidthPxs = fm.width(" ");
int chngeWidthPxs = fm.width(chngeStr);
unsigned int remainWidthPxs = labWidthPxs - unitsWidthPxs - blankWidthPxs - chngeWidthPxs;
if(textWidthInPxs < remainWidthPxs){
result = org;
}
else{
short preIndex = 4, rearIndex =4; //保留前4个字符
int pickUpWidthPxs = 0;
do{
++rearIndex;
QString pickUp = org.mid(preIndex,rearIndex-preIndex);
pickUpWidthPxs = fm.width(pickUp);
QString preFix = org.mid(0,preIndex);
QString sufFix = org.mid(rearIndex, org.length()-rearIndex);
result = preFix + chngeStr + sufFix;
}while(textWidthInPxs-pickUpWidthPxs > remainWidthPxs);
}
return result;
}
测试:
ui->label.setText(scalText(fileName, ui->label.Width(), "1023MB");
方案3:
QString text1("Testing title name! ABCDEFGHIJKMLNPQRSTUVWXYZ#");
QFont ft("MicrosoftYaHei");
ft.setPixelSize(18); // Pixel = DPI * Point / 72
//ft.setPointSize(20);
ft.setBold(true);
QFontMetrics fm(ft);
QString text2 = fm.elidedText(text1, Qt::ElideRight, SIZE_W); // 1行文本
QString text3 = fm.elidedText(text1, Qt::ElideRight, SIZE_W*2); // 2行文本
方案4:
int LEN = 20;
QString str = QString("一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十").left(LEN).leftJustified(LEN+3, '.');
QString str = QString("一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十").left(LEN).rightJustified(LEN+3, '.');
三、更新
第一次更新 2016-09-05
第二次更新 2018-09-04 (增加方案3,方案4)