通常我们在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(); }