事出有因
因為現在做的一個項目是全程全屏顯示的。因此不同屏幕分辨率對程序界面的影響太大。而UI設計的時候又沒有過多的考慮自動布局這方面的事。
雖然在剛開始做界面的時候已經盡量利用自動布局來做,但是有些控件提供的圖片大小不太合適,在做的時候只能給控件設置固定大小。在測試不同分辨率的時候發現界面展現的效果不同。於是就開始想辦法做分辨率適配。
偶然事件
具體忘記當時在搜索什么東西了,大概應該是高分屏適配的問題。在qt的一篇官方文檔中發現了這個好東西:
QT_SCALE_FACTOR [numeric] defines a global scale factor for the whole application, including point-sized fonts.
QT_SCALE_FACTOR
它是一個QT的環境變量,看它的字面意思是縮放因子或者叫縮放系數。
這東西咋用的呢?看一段示例代碼:
qputenv("QT_SCALE_FACTOR", "2.0");
就這么簡單。但是有個條件,就是這句代碼需要放再QApplication實例初始化之前。
它有什么效果呢?
它是用來控制整個程序界面的所有元素的縮放比例的一個環境變量。上面這句代碼的效果就是將整個界面放大為原來的2倍。
來看效果:


怎么用呢
從上面兩張圖可以看出來,在縮放的時候是整個界面進行縮放的。不管是pt單位還是px單位都進行了縮放 。
那么代碼就可以這樣寫。
1 //這個是Windows平台用來獲取屏幕寬度的代碼, 2 //因為在qApplication實例初始化之前,QGuiApplication::screens();無法使用。
3 qreal cx = GetSystemMetrics(SM_CXSCREEN); 4 qreal scale = cx / 960; // 960 = 1920 / 2
5 qputenv("QT_SCALE_FACTOR", QString::number(scale).toLatin1());
上面代碼大概意思就是通過對比當前屏幕的分辨率和設計分辨率(960×540)來確定程序的整體縮放比例。
這樣無論在哪種分辨率情況下界面展現的效果都是一樣的。
備注:
為什么設計分辨率是960×540。因為它是1920×1080的一半。而現在設備的常用分辨率基本上都是1920×1080;更重要的是我自己的電腦分辨率就是1092×1080,因此我的界面設計的時候就是按照1920×1080分辨率設計的。這樣的話我只需要將界面上所有元素的大小減半就行了。另外一個重要的原因就是縮放系數不能小於1.0,不然會出bug,至於到底會發生什么,自己試試就知道了。
后遺症
通過上面兩張圖,你會發現這個全局縮放引發了兩個問題:
圖片放大的時候有鋸齒。
字體在縮放的時候質量不太好。
因此需要另外兩個東西來解決這兩個問題。
調整圖片縮放質量
1 //控制圖片縮放質量
2 QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); 3 QCoreApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);
文字質量
這需要使用另外一個東西”qt.conf“。
內容如下。
1 [Platforms] 2 WindowsArguments = fontengine=freetype
將這個文件放入程序的資源中。路徑為":/qt/etc/qt.conf"
來看效果:

注意事項
縮放系數必須大於等於1.0,不然會出現一些奇怪的問題。而且必須是小數形式的字符串。即使縮放系數經過計算后是整數也要寫成小數形式。即1920/960 = 2要寫成2.0傳遞進去。
至於獲取屏幕尺寸的問題,有些代碼提供了一個思路,就是先初始化一個臨時的QApplocation獲取到屏幕大小后再釋放掉,我不建議這么做,因為在我的項目中這樣做引起了一些bug,偶爾會閃退。建議自己根據平台不同多寫幾行代碼。
