解決背景
在一次做項目的過程中,公司讓我做高分屏適配,就是讓我們所開發的軟件支持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主函數里面操作