Qt 使用全局縮放進行全分辨率適配(QT_SCALE_FACTOR)


事出有因
  因為現在做的一個項目是全程全屏顯示的。因此不同屏幕分辨率對程序界面的影響太大。而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,偶爾會閃退。建議自己根據平台不同多寫幾行代碼。


免責聲明!

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



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