本文的參考鏈接 High DPI Displays
高 DPI 顯示器
高 DPI 顯示器是與標準 DPI 顯示器相比具有增加的像素密度的顯示器。
該像素密度以每英寸點數(shù)(DPI)或每英寸像素數(shù)(PPI)測量,并且由顯示像素的數(shù)量和物理尺寸確定。這意味著僅憑像素數(shù)量不足以確定顯示器是否屬于高 DPI 類別另患。
4K 顯示器具有固定數(shù)量的像素(約 8M)捆等,然而其 DPI 在 185(23英寸)和 110(40英寸) 之間變化。前者是大約 2x 標準的 96 DPI 桌面分辨率,而后者幾乎沒有超過它潭袱。
高 DPI 存在的問題
高 DPI 顯示器會對現(xiàn)有應(yīng)用程序造成許多問題:
- 使用固定坐標的 UI 設(shè)計的應(yīng)用程序看起來很小。 Text 大小以點大小設(shè)置和但是其他屬性尺寸使用像素設(shè)置的組合是特別有問題的锋恬,因為點大小是與顯示器的分辨率無關(guān)的屯换。這種情況下,在低 DPI 顯示屏上看起來正確的字符串的范圍可能在高 DPI 顯示屏上變得太小与学,因此導(dǎo)致文本被剪切而顯示不全彤悔。
- 應(yīng)用程序必須適應(yīng)用戶具有不同分辨率的多個顯示器的情況。 例如索守,他們可能會使用 4K 顯示器作為圖像編輯器的文檔窗口晕窑,同時使用一個低分辨率顯示器作為其他工具的顯示窗口。
支持高 DPI 的傳統(tǒng)方法是 Qt 自動縮放字體卵佛,然后提供應(yīng)用程序代碼可用于擴展 UI 的其余部分的 DPI 值杨赤。
Qt 高 DPI 支持概述
Qt 支持高 DPI 模式,主坐標系虛擬化级遭,獨立于顯示像素密度望拖。這種模式是由某些操作系統(tǒng)(macOS,iOS)實現(xiàn)的挫鸽。此外说敏,Qt 包含一個可能在缺少操作系統(tǒng)支持的地方使用的實現(xiàn)。
現(xiàn)在 Geometry 在設(shè)備無關(guān)的像素中指定丢郊。這包括 widget 和 item geometry盔沫,event geometry,desktop, window 和 screen geometry 以及動畫速度枫匾。渲染輸出處于設(shè)備像素中架诞,對應(yīng)于顯示分辨率。設(shè)備和設(shè)備像素坐標系之間的比是 devicePixelRatio干茉。
應(yīng)用程序主要使用與設(shè)備無關(guān)的像素谴忧。 值得注意的例外是 OpenGL 和與光柵圖形一起使用的代碼。
操作系統(tǒng)支持
Qt 支持的操作系統(tǒng)為高 DPI 顯示屏提供以下支持:
macOS 和 iOS
蘋果平臺在操作系統(tǒng)中實現(xiàn)縮放和協(xié)調(diào)系統(tǒng)虛擬化角虫。通常沾谓,不需要特殊配置。
注意:在 macOS 上戳鹅,通過 Info.plist 文件中的設(shè)置啟用了高 DPI 支持均驶。 確保它們存在:
<key>NSPrincipalClass</key>
<string>NSApplication</string>
<key>NSHighResolutionCapable</key>
<string>True</string>
沒有 qmake 的版本將使用 NSPrincipalClass 密鑰生成 Info.plist,這是因為默認情況下NSHighResolutionCapable 為 true枫虏。
注意:macOS 和 iOS 可以應(yīng)用更多的虛擬化妇穴,使得設(shè)備像素不對應(yīng)于1:1來顯示像素爬虱。 這種情況發(fā)生在iPhone 6+和配置了“顯示縮放”的macOS上。
Microsoft Windows
縮放
用戶可以從控制面板或通過上下文菜單選擇縮放系數(shù)腾它。 這通過使用于查詢系統(tǒng)度量的函數(shù)返回標準字體大小跑筝,窗口邊框大小等的不同值。 它不執(zhí)行任何實際縮放携狭。
DPI Awareness
Windows 上的應(yīng)用程序可以采用以下級別的“DPI Awareness”:
DPI Awareness 級別 | 說明 |
---|---|
DPI Unaware ??????????????????????????????????????????? | 此級別已在 Windows Vista 中引入继蜡。 Windows 將假裝運行在 96 DPI 1920x1080 的標準顯示器上的應(yīng)用程序,并相應(yīng)地縮放應(yīng)用程序逛腿。 它旨在適應(yīng)設(shè)計用于低 DPI 顯示器的舊應(yīng)用程序。 某些工件可能由此類型的縮放產(chǎn)生仅颇。 |
System-DPI Aware | 此級別已在 Windows Vista 中引入单默。 只有連接多個顯示器時,它與每個監(jiān)視器 DPI Aware 不同忘瓦。 Windows 將計算適用于所有連接的顯示器的縮放比例搁廓。 |
Per-Monitor DPI Aware | 此級別已在 Windows 8.1 中引入。 Windows 根本不執(zhí)行縮放耕皮。 |
默認情況下境蜕,Qt 應(yīng)用程序是 Windows 8.1 上的 Per-Monitor DPI Aware 或 Windows 早期版本上的 System-DPI。從 Qt 5.4 開始凌停,可以通過將參數(shù)傳遞給平臺插件來指定級別(請參閱 Using qt.conf):
<application> -platform windows:dpiawareness=0,1,2
Qt 中的高 DPI 支持
一粱年、能夠提供高分辨率的 image 或 pixmap:具體可查看 Drawing High Resolution Versions of Pixmaps and Images。
二罚拟、 Qt 5.6 支持傳統(tǒng)應(yīng)用程序的跨平臺高 DPI 縮放台诗,類似于 macOS 本地化的縮放。這允許為低 DPI 屏幕編寫的應(yīng)用程序在高 DPI 設(shè)備上運行不變赐俗。此功能是可選的加入拉队,可以通過以下環(huán)境變量啟用:
QT_AUTO_SCREEN_SCALE_FACTOR [boolean] 基于顯示器的像素密度實現(xiàn)自動縮放。 這不會改變點大小字體的大小阻逮,因為點是物理單位粱快。 多個屏幕可能會獲得不同的比例因子。
QT_SCALE_FACTOR [numeric] 定義整個應(yīng)用程序的全局比例因子叔扼,包括點大小的字體事哭。
QT_SCREEN_SCALE_FACTORS [list] 指定每個屏幕的比例因子。 這不會改變點大小字體的大小币励。 此環(huán)境變量主要用于調(diào)試慷蠕,或者用于具有錯誤的 EDID information 的顯示器(擴展顯示標識數(shù)據(jù))。格式可以是分號分隔的比例因子列表食呻,它們與 QGuiApplication::screens 的順序相同流炕,也可以是分號分隔的 name = value 對列表澎现,其名稱與 QScreen::name 相同。
雖然 macOS 風(fēng)格完全支持高 DPI每辟,但 Windows 桌面風(fēng)格目前在某些比例因素方面存在一些限制剑辫。 在這些情況下,請考慮使用 Fusion 風(fēng)格渠欺,其目的是在所有情況下支持高 DPI妹蔽。
注意:非整數(shù)比例因子可能會導(dǎo)致顯著的縮放/繪畫偽影。
三挠将、Qt 5.6 中引入的應(yīng)用程序?qū)傩?Qt :: AA_EnableHighDpiScaling 可以根據(jù)顯示器的像素密度進行自動縮放胳岂。
四、在 Qt 5.6 中引入的應(yīng)用程序?qū)傩?Qt :: AA_DisableHighDpiScaling 關(guān)閉所有縮放舔稀。 這適用于需要使用實際的窗口系統(tǒng)坐標的應(yīng)用程序乳丰,無論環(huán)境變量如何。 此屬性優(yōu)先于 Qt::AA_EnableHighDpiScaling内贮。
五产园、在 Qt 5.4 中引入了高 DPI 縮放的實驗實現(xiàn)。 它由環(huán)境變量 QT_DEVICE_PIXEL_RATIO 啟用夜郁,可以將其設(shè)置為數(shù)字比例因子或“自動”什燕。 Qt 5.6 中不推薦使用此變量。
遷移現(xiàn)有應(yīng)用程序
為了能夠快速地將一個在低 DPI 設(shè)備上開發(fā)的應(yīng)用快速地移植并運行在高 DPI 的設(shè)備上竞端,考慮一個縮放選項(例如讓應(yīng)用程序在 Windows 上作為 DPI Unaware 運行屎即,或?qū)h(huán)境變量 QT_AUTO_SCREEN_SCALE_FACTOR 設(shè)置為 “1” )。但是婶熬,這些選項可能會產(chǎn)生一些縮放或重繪剑勾。
從長遠來看,應(yīng)用程序應(yīng)適應(yīng)運行時不修改:
始終使用 QPainter 繪圖 API 的 qreal 版本赵颅。
尺寸與屏幕大小相關(guān)的窗口和對話框虽另。
通過從 font metrics 或屏幕尺寸計算的值替換布局中的硬編碼尺寸和繪制代碼。
高 DPI 術(shù)語詞匯表
術(shù)語 | 說明 |
---|---|
Device Independent Pixels | 應(yīng)用程序使用的像素(User Space)饺谬,受操作系統(tǒng)或 Qt 的縮放捂刺。 |
Device Pixels | 顯示設(shè)備的像素。 |
Device Pixel Ratio | 操作系統(tǒng)或 Qt 使用的縮放因子募寨。 |
Logical DPI | 分辨率用于將以點為單位的字體大小轉(zhuǎn)換為字體大凶逭埂(以像素為單位)。 通常標準值之一為96,128拔鹰,... 192仪缸。 |
Physical DPI | 通過將監(jiān)視器的大小除以像素數(shù)獲得的物理分辨率。 |
Retina Display | 可以查看維基百科中 視網(wǎng)膜顯示器 詞條 |
User Space | 應(yīng)用程序使用的坐標空間(設(shè)備獨立像素)列肢。 |