Qt 界面上字体自适应控件大小 - 随控件缩放

Qt 界面上字体自适应控件大小 - 随控件缩放

引言

Qt控件自适应字体大小可以用adjustSize()函数,但字体自适应控件大小并没有现成的函数可调. - 本文实现了按钮上的字体随按钮大小变化而变化 (如上图所示) - 其他控件同理。

  • 核心思路:根据控件的大小变化,同步调整字体的大小 - 重写resizeEvent函数

一、设计思路

本意是字体随按钮变化,实际上实现的是字体随窗体变化,由于按钮也随窗体变化,可以说是近似等价的实现 - 想变成随按钮变化也简单,将窗体高和宽换成按钮的即可:

    1. 在头文件声明高、宽和字体大小,并在构造函数中初始化 (记录,以便后续对比)
cpp 复制代码
    this->width = this->size().width();
    this->height = this->size().height();
    this->fontsize = ui->pushButton->font().pointSize();
    1. 在窗体resizeEvent函数中,对比窗体高和宽的变化率,按照最小的变化率 (保证字体显示完整) 来控制字体大小。
cpp 复制代码
void Widget::resizeEvent(QResizeEvent *event)
{
    int w = event->size().width();
    int h = event->size().height();
    double scale = 1.0;
    scale = 1.0 * w/this->width;
    if(scale < 1.0 * h/this->height){
        scale = 1.0 * h/this->height;
    }

    QFont font = ui->pushButton->font();
    int new_fontsize = scale * this->fontsize;
    if(new_fontsize != ui->pushButton->font().pointSize()){
        font.setPointSize(new_fontsize);
        ui->pushButton->setFont(font);
        qDebug()<< this->fontsize << " " << new_fontsize;
    }
}

二、进阶版大致思路

    1. 继承现有控件,重写每一个控件的resizeEvent函数,实现字体大小变换
      各个控件需保存自己的原始的大小和字体大小信息,根据原始信息和resize后的信息调整字体。 -- 略繁琐,通用性较差
    1. 写一个函数或类 (推荐类,方便存储原始数据),遍历界面上的控件 (或将需要调整字体的控件提前加入类中的一个list中,在父窗体上resizeEvent函数中遍历list,调整其中控件字体大小即可)。-- 通用性强,较难实现

已经有大佬写了工具:QT界面自适应:https://blog.csdn.net/qq_45280097/article/details/134738567

三、参考链接

Qt 控件自适应字体大小:https://blog.csdn.net/lxj362343/article/details/108245226

Qt学习之路------字体跟随控件自适应(笔记):https://blog.csdn.net/qq_39020917/article/details/131911691

Qt Windows高清DPI自适应分辨率缩放,比较完美的解决方案:https://blog.csdn.net/startl/article/details/105862817

相关推荐
草莓熊Lotso37 分钟前
Qt 进阶核心:UI 开发 + 项目解析 + 内存管理实战(从 Hello World 到对象树)
运维·开发语言·c++·人工智能·qt·ui·智能手机
2501_9418656342 分钟前
从事件驱动到异步架构的互联网工程语法构建与多语言实践分享
java·开发语言·jvm
前端 贾公子4 小时前
v-if 与 v-for 的优先级对比
开发语言·前端·javascript
嗯嗯=5 小时前
python学习篇
开发语言·python·学习
不会c嘎嘎7 小时前
QT中的常用控件 (二)
开发语言·qt
是一个Bug8 小时前
50道核心JVM面试题
java·开发语言·面试
她和夏天一样热8 小时前
【观后感】Java线程池实现原理及其在美团业务中的实践
java·开发语言·jvm
lkbhua莱克瓦248 小时前
进阶-索引3-性能分析
开发语言·数据库·笔记·mysql·索引·性能分析
郑州光合科技余经理8 小时前
技术架构:上门服务APP海外版源码部署
java·大数据·开发语言·前端·架构·uni-app·php
篱笆院的狗8 小时前
Java 中的 DelayQueue 和 ScheduledThreadPool 有什么区别?
java·开发语言