QT 界面全分辨率适配

通常我们在QT适配不同窗口大小的时候,是通过布局的方式来解决的。

但是如果窗口中的控件很多,而且有的控件需要叠放在别的控件上方,各个控件之间的位置没有什么规律而言的情况下,想要使用布局来适配各种分辨率,就极其困难,就算做出来,那工作量特别特别特别大

而且在后期想要对界面进行修改的时候,也是极其不方便的。

在一片博客中提到了这样的方法,可以解决这样的问题:https://www.cnblogs.com/ybqjymy/p/14821043.html

就是使用QT_SCALE_FACTOR缩放因子

在Qapplication创建实例之前,加上这样一句代码,就可以使窗口中的控件按任意比例缩放,且缩放的时候是整个界面进行缩放的,不管是pt单位还是px单位都进行了缩放 。

qputenv("QT_SCALE_FACTOR", "1.5");

注意第二个参数,必须是一个小数转换而成的字符串,而且必须大于1.0,否则界面上的控件将无法显示,也就是说,这个方法适用于放大,而不适用于缩小,因此在使用之前需要给窗口确定一个最小尺寸,仅在此尺寸上放大,满足其他分辨率。

这里提供的参数是"1.5",即将界面上所有控件放大1.5倍。

 

根据不同的分辨率放大不同的尺寸,可以使用winAPI获取当前分辨率的宽度

GetSystemMetrics(SM_CXSCREEN);

直接使用该函数QT会报错,一是无法解析的标识符,二是缺少对应的库,所以我们还需要在开头加上以下两行代码

#include "windows.h"
#pragma comment(lib,"User32.lib")

之后就可以正常使用这个API了

不使用QT的类获取屏幕分辨率的原因是,QT类获取分辨率,必须要在程序创建QApplication之后,但是qputenv函数又必须放在QApplication之前,这样就矛盾了,无法对控件进行缩放。

完整代码如下:

#include "virtualexperiment.h"
#include <QApplication>

#include "windows.h"
#pragma comment(lib,"User32.lib")
#pragma execution_character_set("utf-8")

int main(int argc, char *argv[])
{ 
    QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QCoreApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);//控制图片缩放质量

    qreal  cx = GetSystemMetrics(SM_CXSCREEN);//这个是Windows平台用来获取屏幕宽度的代码,因为在qApplication实例初始化之前,QGuiApplication::screens();无法使用。
    if(cx < 1360)
        return 0;
    qreal scale = cx / 1360;
    qputenv("QT_SCALE_FACTOR", QString::number(scale).toLatin1());

    QApplication a(argc, argv);
    VirtualExperiment w;
    w.show();

    return a.exec();
}

 

QT 界面全分辨率适配

上一篇:this 详解


下一篇:idea本地调式tomcat源码