Qt篇——QLabel固定尺寸的情况下让字体大小自适应并自动换行以完整显示

news/2024/7/8 6:21:24 标签: qt, 数据库, 开发语言

当文字较少时,默认字体大小为16;当文字内容较多时,自动换行并缩小字体。

举例:

字体较少时

字体较多时

思路:

设置自动换行属性 setWordWrap;通过QFontMetrics计算文字字体要多大、显示多少行才不会超过Label的尺寸从而完整显示,然后在每行文字的末尾添加空格让自动换行能够拆分你的字符串。

代码:

void MainFrame::fixedWrapLabel(QLabel *label, QString text) {
    QFont font = label->font();
    QFontMetrics metrics(font);
    //99999是字体最大数量, 利用QFontMetrics计算出文字的理论宽高
    QString elidedText = metrics.elidedText(text, Qt::ElideNone, 99999);
    //要把label的margin考虑进去
    int margin = label->margin();
    //设置自动换行
    label->setWordWrap(true);
    int pointSize = font.pointSize();
    int row = 1;
    //如果字体的总长度除以行数比label尺寸宽,则继续缩小字体
    while (metrics.width(elidedText) * 1.0 / row > (label->width() - margin * 2)
           && pointSize > 0) {
        //计算缩小字体后的文字高度和label的高度的比例,得出当前应该换多少行
        //我这里最多只用了3行,根据你的实际情况可以不限制最多行数
        if (metrics.height() < (label->height() - margin * 2) / 3.0) {
            row = 3;
        } else if (metrics.height() < (label->height() - margin * 2) / 2.0) {
            row = 2;
        }
        //缩小字体并设置给QFontMetrics 
        font.setPointSize(pointSize--);
        metrics = QFontMetrics(font);
        elidedText = metrics.elidedText(text, Qt::ElideNone, label->width());
    }
    int rowSize = elidedText.size() / row;
    //这里很关键,因为QLabel的setWordWrap自动换行不会分割字符和字母
    //所以我们要根据我们计算出来的行数,在每行末尾添加空格,QLabel换行会根据空格进行拆分换行
    for (int i = 1; i < row; i++) {
        elidedText.insert(rowSize * i + 1, " ");
    }
    //设置字体
    label->setFont(font);
    //显示添加空格来换行的最终文本
    label->setText(elidedText);
}


http://www.niftyadmin.cn/n/5536707.html

相关文章

完整篇-Python数据类型转换

目录 1、「整数到浮点数」&#xff1a; 2、「浮点数到整数」&#xff1a; 3、「字符串到整数」&#xff1a; 4、「字符串到浮点数」&#xff1a; 5、「整数到字符串」&#xff1a; 6、「浮点数到字符串」&#xff1a; 7、「布尔值到整数」&#xff1a; 8、「列表到元组…

LINUX 安装MINIO文件服务

1、进入/usr/local/目录创建minio路径 cd /usr/localmkdir minio 2、进入minio目录&#xff0c;下载minio服务&#xff08;免安装&#xff09; cd miniowget https://dl.minio.io/server/minio/release/linux-amd64/minio3、授权可执行 chmod 777 minio4、设置环境变量&…

缠中说禅李彪08年“假死”具体原因探讨

在缠中说禅的信徒圈内&#xff0c;流传着创始人李彪于2008年逝世的说法&#xff0c;这一事件常被描绘成一种悲壮的牺牲&#xff0c;仿佛是为了其理念与信徒们的福祉鞠躬尽瘁。然而&#xff0c;这一“逝世”既未经公开证实&#xff0c;也与李彪生前构建的高大名声形成了某种讽刺…

程序员绩效管理-进一步思考

工时管理也好、项目管理&#xff08;软件项目&#xff09;也好&#xff0c;市面上已经很多了&#xff0c;你做这个和他们区别何在&#xff1f;大的公司一般都自己做&#xff0c;谁又为你买单&#xff1f;根据目前的反馈&#xff0c;主要的疑问就是这两个问题。 进一步思考如下&…

鸿蒙系统的开发与学习

1.开发工具的下载 DevEco Studio-HarmonyOS Next Beta版-华为开发者联盟 安装、环境配置时&#xff0c;建议 自定义目录 注意&#xff1a;路径中不要有 中文、特殊字符。 2.ArkTS基础总结 1&#xff09;三种数据类型 ① string 字符串&#xff1a;描述信息 ② number 数…

利用ssh的端口转发让内网电脑上网

有两台linux服务器&#xff0c;一台A可以上外网 &#xff0c;ip为192.168.16.72&#xff0c;另一台B只能上内网&#xff0c;ip为192.168.16.202 。这两台服务器可以通过ssh互通。 现在因为服务器B需要下载软件和依赖包&#xff0c;需要连外网&#xff0c;怎么办&#xff1f; …

Java技术栈总结:Redis篇

一、数据类型 Redis 自身是一个 Map&#xff0c;其中的所有数据均采用“key:value”的形式存储。 数据类型指的是存储的数据的类型&#xff0c;即 value 部分的类型&#xff0c;key 的部分只能是字符串。 value 部分的数据类型&#xff1a;<String、List、Hash、Set、Zse…

FPGA/数字IC复习八股

一、FPGA概念&#xff0c;与数字IC的区别 二、FPGA底层逻辑 三、同步电路、异步电路以及优缺点 四、同步复位、异步复位、异步复位同步释放 深入理解复位---同步复位&#xff0c;异步复位&#xff0c;异步复位同步释放(含多时钟域&#xff09;_画出支持异步复位dff的电路图…