V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zoule
V2EX  ›  Qt

Qt4K 高分屏自适应,解决字体没有跟随组件增大的问题

  •  
  •   zoule · 2021-03-23 17:55:53 +08:00 · 1440 次点击
    这是一个创建于 1101 天前的主题,其中的信息可能已经有所发展或是发生改变。

    解决背景

    在一次做项目的过程中,公司让我做高分屏适配,就是让我们所开发的软件支持 4K 屏的显示,我在百度上开始搜索资料,有很多博客给出的答案就是:

    #if(QT_VERSION >= QT_VERSION_CHECK(5,6,0))
            QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    #endif
            QApplication a(argc, argv);
    

       

    解决过程

    我也这样做了,结果,没错,Qt 确实是把窗口以及组件的大小进行了屏幕自适应,但是组件内的字体大小却没有改变,所以显示出来的结果就是这个样子,如图:  

    解决方法

    看上去是不是很不协调,很丑有没有,但是没办法,你如果非得让我给你解释原理的话,就是:原因是 qt 的 dpi 计算错误,这样的情况会导致 qt 在不同的平台上大小不一,解决的方法就是设置好 qt 的 dpi,qt 是根据显示器的物理长度或者宽度于分辨率的关系来计算 dpi 的, 所以,咱们把 Qt 字体的 PointSize 重新设置,一次,就能解决这个问题。废话不说直接上代码:

    #if(QT_VERSION >= QT_VERSION_CHECK(5,6,0))
            QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    #endif
            QApplication a(argc, argv);
            
            QFont font = a.font();
            font.setPointSize(10);//这个值根据自身情况自行调节,如果字体没变化,把 setPointSize()内的值继续增大
            a.setFont(font); 
    

    当你把 setPointSize()内的值设置大了之后,你会发现,显示竟然正常了,如图:    

    最终代码

    现在的话,字体大小就已经正常了,但是如果在 1080P 上面字体可能会更大,因为你现在是在 4K 屏,所以看上去是正常的,那咱们接下来应该怎么做,很简单,让 setPointSize()的值根据系统自行调节,问题就解决了,废话不说,继续上代码:

    #if(QT_VERSION >= QT_VERSION_CHECK(5,6,0))
            QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    #endif
            QApplication a(argc, argv);
            
            const float DEFAULT_DPI = 96.0;
            HDC screen = GetDC(NULL);
            FLOAT dpiX = static_cast<FLOAT>(GetDeviceCaps(screen, LOGPIXELSX));
            ReleaseDC(0, screen);
        float fontSize = dpiX / DEFAULT_DPI;
        
            QFont font = a.font();
            font.setPointSize(font.pointSize()*fontSize);
            a.setFont(font);
    

    好了,这样的话,问题解决,这样自适应问题就解决掉了 注:这些操作都需在 main 主函数里面操作

    whi147
        1
    whi147  
       2021-03-23 20:49:38 +08:00 via iPhone
    5.14 起有更好的 dpi 自适应
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2887 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 00:19 · PVG 08:19 · LAX 17:19 · JFK 20:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.