一、应用场景简述

当在有限宽度的QLable中显示很长的文件名/字符串时,超出QLabel宽度部分将不会显示,此时采取缩短文件名策略(也可实现为字符串滚动动画)可以缓解这一问题。在实现这一想法的过程中,先后提出两个解决方案。遂再次分享给大家。

二、方案实现

//方案1:简单的保留前面几个字符,去出中间的几个字符,保留后面几个字符

  1. QString scalText(QString org)
  2. {
  3. QString result;
  4. const quint16 strLen = org.length();
  5. int index = org.lastIndexOf(".");
  6. if(-1 == index){ //如果返回-1表示没找到
  7. //无后缀名
  8. QString fileName = org;
  9. if( strLen < 11)
  10. result = fileName;
  11. else{
  12. result = fileName.mid(0,3); //取前三个字符
  13. result += "...";
  14. result = fileName.mid(strLen-6,6); //取后6个字符
  15. }
  16. }
  17. else{
  18. //有后缀名
  19. if( strLen < 11){
  20. result = org;
  21. }
  22. else{
  23. const QString fileName = org.left(index); //文件名
  24. const quint16 fileNameLen = fileName.length();
  25. const QString fileExtName = org.right(strLen - 1 - org.lastIndexOf(".")); //文件扩展名
  26. result = fileName.mid(0,3);
  27. result += "..." + fileName.mid(fileNameLen-3,3); //取后3个字符
  28. result += "." + fileExtName;      //追加后缀名
  29. }
  30. }
  31. return result;
  32. }

此实现方案灵活性差,通用性差,而且在文件名/字符串中混合这ASCII码和宽字符时显示效果极差。

//方案2:根据QLabel的实际宽度、字体的尺寸属性等对文件名进行缩短

//目标: 将“长文件名测试文件-长文件名测试文件-长文件名测试文件.wmv 1203MB”缩短为“长文件名...测试文件.wmv 1203MB”

//定义: QString scalText(QString org, unsigned int showWidth ,QString arg1="");

//参数:org-待缩短的字符串/文件名,如上面的“长文件名测试文件-长文件名测试文件-长文件名测试文件.wmv”

//            showWidht-QLabel的实际宽度

//            arg1-追加到org后面的补充字符串

  1. QString scalText(QString org, unsigned int showWidth ,QString arg1)
  2. {
  3. QString result;
  4. QString chngeStr("...");
  5. QFontMetrics fm(QFont("微软雅黑",10));
  6. const unsigned int labWidthPxs = showWidth-10; //label的固定宽度
  7. int textWidthInPxs = fm.width(org);
  8. int unitsWidthPxs = fm.width(arg1);
  9. int blankWidthPxs = fm.width(" ");
  10. int chngeWidthPxs = fm.width(chngeStr);
  11. unsigned int remainWidthPxs = labWidthPxs - unitsWidthPxs - blankWidthPxs - chngeWidthPxs;
  12. if(textWidthInPxs < remainWidthPxs){
  13. result = org;
  14. }
  15. else{
  16. short preIndex = 4, rearIndex =4;  //保留前4个字符
  17. int pickUpWidthPxs = 0;
  18. do{
  19. ++rearIndex;
  20. QString pickUp = org.mid(preIndex,rearIndex-preIndex);
  21. pickUpWidthPxs = fm.width(pickUp);
  22. QString preFix = org.mid(0,preIndex);
  23. QString sufFix = org.mid(rearIndex, org.length()-rearIndex);
  24. result = preFix + chngeStr + sufFix;
  25. }while(textWidthInPxs-pickUpWidthPxs > remainWidthPxs);
  26. }
  27. return result;
  28. }
 

测试:

ui->label.setText(scalText(fileName, ui->label.Width(), "1023MB");

三、更新

第一次更新  2016-09-05

http://blog.csdn.net/qq2399431200/article/details/52438562

Qt实现长文件名(字符串)在QLabel中自适应缩短的更多相关文章

  1. [QT]QPixmap图片缩放和QLabel 的图片自适应效果对比

    图片大小为600x600 效果图: ui->label->setScaledContents(true);                                         ...

  2. Win 10 开发中Adaptive磁贴模板的XML文档结构,Win10 应用开发中自适应Toast通知的XML文档结构

    分享两篇Win 10应用开发的XML文档结构:Win 10 开发中Adaptive磁贴模板的XML文档结构,Win10 应用开发中自适应Toast通知的XML文档结构. Win 10 开发中Adapt ...

  3. QT5如何设置QLabel中字体的颜色

    修改了wd的文章: 如何使用Qt5,设置QLabel中字体的颜色. 大致有几种做法: 一是使用setPalette()方法: 二是使用样式表: 三是可以使用QStyle: 四是可以在其中使用一些简单的 ...

  4. divmod(a,b)函数是实现a除以b,然后返回商与余数的元组、eval可以执行一个字符串形式的表达式、exec语句用来执行储存在字符串或文件中的Python语句

    #!/usr/bin/env python a = 10/3 print(a) #divmod计算商与余数 r = divmod(10001,20) print(r) #eval可以执行一个字符串形式 ...

  5. 获取一个字符串Hello world中world首次出现的位置

    获取一个字符串Hello world中world首次出现的位置 var str=“Hello world!” document.write(str.indexOf("world") ...

  6. C字符串和C++中string的区别 &&&&C++中int型与string型互相转换

    在C++中则把字符串封装成了一种数据类型string,可以直接声明变量并进行赋值等字符串操作.以下是C字符串和C++中string的区别:   C字符串 string对象(C++) 所需的头文件名称 ...

  7. C字符串和C++中string的区别 &amp;&amp;&amp;&amp;C++中int型与string型互相转换

    在C++中则把字符串封装成了一种数据类型string,可以直接声明变量并进行赋值等字符串操作.以下是C字符串和C++中string的区别:   C字符串 string对象(C++) 所需的头文件名称 ...

  8. Java 字符串比较,String 中的一些方法 == 和 equals 的详解

    "==" 是比较的是两个对象的内存地址,而equals方法默认情况下是比较两个对象的内存地址. 1.String str = "hello"  生成的字符串,首 ...

  9. 字符和字符串在Java中的旅程

    以下是个人对java中字符和字符串的见解,如有疏漏之处,还请不吝赐教. 下面通过一个简单的程序来说明字符和字符串在Java中的旅程. 以字符 ' 中 '为例, 它的GBK编码是2个字节:0xd6d0, ...

随机推荐

  1. Unity3d 配置OpenCV(EmguCV) 周围环境

    最近毕业.我们一直在研究如何Unity正在使用EmguCV,最后,有些吃老本的今天. 我的环境:Unity3d 4.3.1f             libemgucv-windows-univers ...

  2. 【BZOJ 1025】[SCOI2009]游戏

    [题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1025 [题意] [题解] 每一个对应关系,里面其实都会生成大小不一的几个环. 每一个环 ...

  3. Eclipse Che安装依赖

    java Java 用于运行Che的服务器和用于创建Plug-in包的SDK工具,所以需要安装Java Jdk 1.8 如果只是运行Che的话下载JRE就足够了,但是加入你需要从源代码编译的话你还需要 ...

  4. 记排查octopress生成时的编码错误

    前些日子经若亮童鞋提醒,我在其他推荐的页面中增加了对 Dropbox 和 Linode 等工具的推荐,一来分享这些好用的产品,二来期望刚接触这些工具的好心的朋友可以不吝啬时间用我的推荐码注册,让我获得 ...

  5. C++闭包,一样很简单

    引用百度上对闭包的定义:闭包是指可以包含自由(未绑定到特定对象)变量的代码块:这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义(局部变量).“闭包” 一词来源于以下两 ...

  6. gdal库中设置prj4库全路径的用法

    作者:朱金灿 来源:http://blog.csdn.net/clever101 gdal库实现投影转换之类的功能实际上底层都是调用prj4库的功能.如果gdal使用非静态的方式集成prj4库,实际上 ...

  7. 黑科技 —— Type-C 接口与 USB3.1

    Type-C 接口解决了 USB 永远插不准的世界性难题. 小开科普一分钟:究竟USB Type-C是何方神圣? 1. Type-C USB Type-C,简称是 USB-C.Type-C 只是 US ...

  8. 说下IEnumerable相关的

    IEnumerable 我们每天都在使用foreach进行遍历,今天讨论下面三个常见的问题: 为什么在foreach中不能修改item的值 要实现foreach需要满足什么条件 为什么Linq to ...

  9. [android]完美的解决方案ListView加载网络图片反弹问题

    为什么 先说为什么有照片反弹. 使用convertView对ListView的每一个item优化,item的复用能够有效减少内存的占用.使ListView滑动更为流畅. 但会带来一个问题,当最顶部的i ...

  10. 机房收费系统vb.net之打包与部署(一)

    从机房重构到如今,我最大的感受就是万事开头难,万事结尾难!开头难是由于那个思路理不清,对三层已经设计模式的应用不够熟悉,结尾难就是打包部署了!这几天非常头疼,以为完毕了代码就大功告成了,但是没想到啊, ...