Qt实现长文件名(字符串)在QLabel中自适应缩短
一、应用场景简述
当在有限宽度的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");
三、更新
第一次更新 2016-09-05
http://blog.csdn.net/qq2399431200/article/details/52438562
Qt实现长文件名(字符串)在QLabel中自适应缩短的更多相关文章
- [QT]QPixmap图片缩放和QLabel 的图片自适应效果对比
图片大小为600x600 效果图: ui->label->setScaledContents(true); ...
- Win 10 开发中Adaptive磁贴模板的XML文档结构,Win10 应用开发中自适应Toast通知的XML文档结构
分享两篇Win 10应用开发的XML文档结构:Win 10 开发中Adaptive磁贴模板的XML文档结构,Win10 应用开发中自适应Toast通知的XML文档结构. Win 10 开发中Adapt ...
- QT5如何设置QLabel中字体的颜色
修改了wd的文章: 如何使用Qt5,设置QLabel中字体的颜色. 大致有几种做法: 一是使用setPalette()方法: 二是使用样式表: 三是可以使用QStyle: 四是可以在其中使用一些简单的 ...
- 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可以执行一个字符串形式 ...
- 获取一个字符串Hello world中world首次出现的位置
获取一个字符串Hello world中world首次出现的位置 var str=“Hello world!” document.write(str.indexOf("world") ...
- C字符串和C++中string的区别 &&&&C++中int型与string型互相转换
在C++中则把字符串封装成了一种数据类型string,可以直接声明变量并进行赋值等字符串操作.以下是C字符串和C++中string的区别: C字符串 string对象(C++) 所需的头文件名称 ...
- C字符串和C++中string的区别 &&&&C++中int型与string型互相转换
在C++中则把字符串封装成了一种数据类型string,可以直接声明变量并进行赋值等字符串操作.以下是C字符串和C++中string的区别: C字符串 string对象(C++) 所需的头文件名称 ...
- Java 字符串比较,String 中的一些方法 == 和 equals 的详解
"==" 是比较的是两个对象的内存地址,而equals方法默认情况下是比较两个对象的内存地址. 1.String str = "hello" 生成的字符串,首 ...
- 字符和字符串在Java中的旅程
以下是个人对java中字符和字符串的见解,如有疏漏之处,还请不吝赐教. 下面通过一个简单的程序来说明字符和字符串在Java中的旅程. 以字符 ' 中 '为例, 它的GBK编码是2个字节:0xd6d0, ...
随机推荐
- 数据结构 Tricks(一)—— 父节点和左右孩子索引号之间的关系
如果以第 0 个位置开始标记树根节点,则第 i 个结点的左右孩子分别为: 2i+1 2i+2 反之,如果一个结点的标号为 i,则其父节点为: i/2:i 为左孩子结点: i/2-1:i 为右孩子结点: ...
- [Erlang 0057] Erlang 排错利器: Erlang Crash Dump Viewer
http://www.cnblogs.com/me-sa/archive/2012/04/28/2475556.html Erlang Crash Dump Viewer真的是排错的天兵神器,还记得我 ...
- 学习鸟哥的Linux私房菜笔记(11)——系统监视1
一.了解系统状况 uname:显示系统信息 hostname:显示主机名 last:列出最近的用户登录 lastlog:列出每一个用户的最近登录情况 free:显示内存使用状况 还可以使用vmstat ...
- 新一代Xamarin
新一代Xamarin竟然可以将.NET代码原生编译成:Jar包供Java原生调用.swift类库.obj-c类库.C++类库 供目标平台传统代码直接调用 之前和很多朋友聊到Xamarin觉得确实不错, ...
- Sitecore
Sitecore 功能最强大.最丰富的企业级 .NET 网站内容管理系统.包含的功能如下所述: 内容编辑和会话中的个性化 用于预览访客所看到的网站内容的体验浏览器 设备和地理位置 IP 检测(需要额外 ...
- [译]async/await中使用阻塞式代码导致死锁
原文:[译]async/await中使用阻塞式代码导致死锁 这篇博文主要是讲解在async/await中使用阻塞式代码导致死锁的问题,以及如何避免出现这种死锁.内容主要是从作者Stephen Clea ...
- vuex的简单例子和vue model组件
好久没用过vuex了,vuex官方示例的计算器counter是用的webpack打包了单文件组件,不方便回顾,今天把代码改成了html引人的方式,方便回顾 <!DOCTYPE html> ...
- 聊聊QPS/TPS/并发量/系统吞吐量的概念
原文:聊聊QPS/TPS/并发量/系统吞吐量的概念 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/cainiao_user/article/deta ...
- 关于easyui-accordion的添加以及显示隐藏菜单的使用
<script type="text/javascript"> $(function() { leftMenus(); }); function leftMenus() ...
- Codeforces 85B. Embassy Queue【段树、馋】
标题效果: 每个人都应该申请签证必须向大使馆3种程序,而这3个步骤做的顺序是固定的.通过各种形式的手续给出多少,它需要对每个过程的处理时间,有多少人会来办理手续,什么时间来.要求的是全部人分别在大使馆 ...