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