QLineEdit文本长度和框宽度的比较问题

2024-05-14 15:04

本文主要是介绍QLineEdit文本长度和框宽度的比较问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

开发环境

            操作系统: 银河麒麟V10SP1qt版本  : 5.12.12

背景

测试同事提出,QLineEdit中设置的占位符(由setPlaceholderText函数设置)文本能完全显示时不要显示tips,不完全显示时要显示tips,这样显得简洁。

想了想逻辑上比较好实现,那就是占位符文本长度大于QLineEdit宽度就显示tips,小于等于就不显示,很清晰。

问题

实际操作,很快就把代码写出来了,如下

            QString qstr = ui->lineEdit_set->text();//获取字符串长度QFontMetrics qFontMetrics(ui->lineEdit_show->font());int fontSize = qFontMetrics.width(qstr);//获得显示输入框宽度int lineditWidth = ui->lineEdit_show->width();//判断并设置tipsif(fontSize >= ui->lineEdit_show->width()){ui->lineEdit_show->setToolTip(qstr);}else{ui->lineEdit_show->setToolTip("");}//设置占位符ui->lineEdit_show->setPlaceholderText(qstr); 

但是总有一点小问题,一个字符一个字符增加的去试,总会出现占位符文本已经不完全显示了但tips也没有出现的情况。打日志发现此时fontSize小于lineditWidth,说明是fontSize或者lineditWidth的值有问题。

这是一个必现问题,虽然没什么影响但是却让我很难受,决定一探究竟。

排查

排查过程还是比较长的,走了好多弯路就不赘述了。总之疑惑可以从qt源码里解决的。排查过程中以下面的函数为入口。

    QString qstrshow = qFontMetrics.elidedText(qstr, Qt::ElideRight, ui->lineEdit_show->width());qDebug() << "qstrshow = " << qstrshow;

通过传入文本内容、隐藏方式和输入框宽度,函数会返回文本的最终展示形态。这个函数返回值出现的问题和上面描述的一样。qstr长度比lineEdit_show宽度小,但返回的文本确是隐藏状态(xxxx...)。这样直接跟踪源码即可。

    void QLineEdit::paintEvent(QPaintEvent *)内部有如下代码initStyleOption(&panel);style()->drawPrimitive(QStyle::PE_PanelLineEdit, &panel, &p, this);QRect r = style()->subElementRect(QStyle::SE_LineEditContents, &panel, this); //此函数执行完 QLineEdit控件 宽度就会小2个像素其中style()->subElementRect调用的是QCommonStyle::subElementRect,其内部执行至case SE_LineEditContents:if (const QStyleOptionFrame *f = qstyleoption_cast(opt)) {r = f->rect.adjusted(f->lineWidth, f->lineWidth, -f->lineWidth, -f->lineWidth);    //这里进行了调整,调整之后宽度小2个像素【TODO 我感觉应该是小1像素,怎么小2像素了】r = visualRect(opt->direction, opt->rect, r);}break;f->lineWidth的值是1,上面的initStyleOption(&panel);中进行赋值。initStyleOption(&panel)内部调用的是QFusionStyle::pixelMetric,其内部执行的代码如下case PM_DefaultFrameWidth:return 1; // Do not dpi-scale because the drawn frame is always exactly 1 pixel thick接着回到void QLineEdit::paintEvent(QPaintEvent *)中,执行到QRect lineRect(r.x() + d->horizontalMargin, d->vscroll, r.width() - 2*d->horizontalMargin, fm.height()); //在r的基础上生成lineRectd->horizontalMargin的值是2,来自const int QLineEditPrivate::horizontalMargin(2);//这样lineRect比r又小了4像素

经过源码分析,发现实际用的QLineEdit宽度比传入的小了6像素,所以比较的时候需要把QLineEdit的宽度减6,更新代码如下

    int offset = -6;if(fontSize >= ui->lineEdit_show->width() + offset){ui->lineEdit_show->setToolTip(qstr);}else{ui->lineEdit_show->setToolTip("");}ui->lineEdit_show->setPlaceholderText(qstr);

注意

如果没有任何样式影响,结果就如上面所示。如果有样式(样式表、操作系统的主题样式)影响,则要再进行额外处理。

这篇关于QLineEdit文本长度和框宽度的比较问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/989063

相关文章

解决IDEA报错:编码GBK的不可映射字符问题

《解决IDEA报错:编码GBK的不可映射字符问题》:本文主要介绍解决IDEA报错:编码GBK的不可映射字符问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录IDEA报错:编码GBK的不可映射字符终端软件问题描述原因分析解决方案方法1:将命令改为方法2:右下jav

MyBatis模糊查询报错:ParserException: not supported.pos 问题解决

《MyBatis模糊查询报错:ParserException:notsupported.pos问题解决》本文主要介绍了MyBatis模糊查询报错:ParserException:notsuppo... 目录问题描述问题根源错误SQL解析逻辑深层原因分析三种解决方案方案一:使用CONCAT函数(推荐)方案二:

Redis 热 key 和大 key 问题小结

《Redis热key和大key问题小结》:本文主要介绍Redis热key和大key问题小结,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、什么是 Redis 热 key?热 key(Hot Key)定义: 热 key 常见表现:热 key 的风险:二、

IntelliJ IDEA 中配置 Spring MVC 环境的详细步骤及问题解决

《IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决》:本文主要介绍IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决,本文分步骤结合实例给大... 目录步骤 1:创建 Maven Web 项目步骤 2:添加 Spring MVC 依赖1、保存后执行2、将新的依赖

Spring 中的循环引用问题解决方法

《Spring中的循环引用问题解决方法》:本文主要介绍Spring中的循环引用问题解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录什么是循环引用?循环依赖三级缓存解决循环依赖二级缓存三级缓存本章来聊聊Spring 中的循环引用问题该如何解决。这里聊

Spring Boot中JSON数值溢出问题从报错到优雅解决办法

《SpringBoot中JSON数值溢出问题从报错到优雅解决办法》:本文主要介绍SpringBoot中JSON数值溢出问题从报错到优雅的解决办法,通过修改字段类型为Long、添加全局异常处理和... 目录一、问题背景:为什么我的接口突然报错了?二、为什么会发生这个错误?1. Java 数据类型的“容量”限制

关于MongoDB图片URL存储异常问题以及解决

《关于MongoDB图片URL存储异常问题以及解决》:本文主要介绍关于MongoDB图片URL存储异常问题以及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录MongoDB图片URL存储异常问题项目场景问题描述原因分析解决方案预防措施js总结MongoDB图

SpringBoot项目中报错The field screenShot exceeds its maximum permitted size of 1048576 bytes.的问题及解决

《SpringBoot项目中报错ThefieldscreenShotexceedsitsmaximumpermittedsizeof1048576bytes.的问题及解决》这篇文章... 目录项目场景问题描述原因分析解决方案总结项目场景javascript提示:项目相关背景:项目场景:基于Spring

解决Maven项目idea找不到本地仓库jar包问题以及使用mvn install:install-file

《解决Maven项目idea找不到本地仓库jar包问题以及使用mvninstall:install-file》:本文主要介绍解决Maven项目idea找不到本地仓库jar包问题以及使用mvnin... 目录Maven项目idea找不到本地仓库jar包以及使用mvn install:install-file基

使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)

《使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)》PPT是一种高效的信息展示工具,广泛应用于教育、商务和设计等多个领域,PPT文档中常常包含丰富的图片内容,这些图片不仅提升了... 目录一、引言二、环境与工具三、python 提取PPT背景图片3.1 提取幻灯片背景图片3.2 提取