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();
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM