Qt 對高 DPI 顯示器的支持簡介

本文的參考鏈接 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)用程序造成許多問題:

  1. 使用固定坐標的 UI 設(shè)計的應(yīng)用程序看起來很小。 Text 大小以點大小設(shè)置和但是其他屬性尺寸使用像素設(shè)置的組合是特別有問題的锋恬,因為點大小是與顯示器的分辨率無關(guān)的屯换。這種情況下,在低 DPI 顯示屏上看起來正確的字符串的范圍可能在高 DPI 顯示屏上變得太小与学,因此導(dǎo)致文本被剪切而顯示不全彤悔。
  2. 應(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)境變量啟用:

  1. QT_AUTO_SCREEN_SCALE_FACTOR [boolean] 基于顯示器的像素密度實現(xiàn)自動縮放。 這不會改變點大小字體的大小阻逮,因為點是物理單位粱快。 多個屏幕可能會獲得不同的比例因子。

  2. QT_SCALE_FACTOR [numeric] 定義整個應(yīng)用程序的全局比例因子叔扼,包括點大小的字體事哭。

  3. 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)運行時不修改:

  1. 始終使用 QPainter 繪圖 API 的 qreal 版本赵颅。

  2. 尺寸與屏幕大小相關(guān)的窗口和對話框虽另。

  3. 通過從 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è)備獨立像素)列肢。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末恰画,一起剝皮案震驚了整個濱河市宾茂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拴还,老刑警劉巖跨晴,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異片林,居然都是意外死亡端盆,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門费封,熙熙樓的掌柜王于貴愁眉苦臉地迎上來焕妙,“玉大人,你說我怎么就攤上這事弓摘》玫校” “怎么了?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵衣盾,是天一觀的道長。 經(jīng)常有香客問我爷抓,道長势决,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任蓝撇,我火速辦了婚禮果复,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘渤昌。我一直安慰自己虽抄,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布独柑。 她就那樣靜靜地躺著迈窟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪忌栅。 梳的紋絲不亂的頭發(fā)上车酣,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天,我揣著相機與錄音索绪,去河邊找鬼湖员。 笑死,一個胖子當(dāng)著我的面吹牛瑞驱,可吹牛的內(nèi)容都是我干的娘摔。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼唤反,長吁一口氣:“原來是場噩夢啊……” “哼凳寺!你這毒婦竟也來了鸭津?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤读第,失蹤者是張志新(化名)和其女友劉穎曙博,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體怜瞒,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡父泳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了吴汪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惠窄。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖漾橙,靈堂內(nèi)的尸體忽然破棺而出杆融,到底是詐尸還是另有隱情,我是刑警寧澤霜运,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布脾歇,位于F島的核電站,受9級特大地震影響淘捡,放射性物質(zhì)發(fā)生泄漏藕各。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一焦除、第九天 我趴在偏房一處隱蔽的房頂上張望激况。 院中可真熱鬧,春花似錦膘魄、人聲如沸乌逐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽浙踢。三九已至,卻和暖如春蹈丸,著一層夾襖步出監(jiān)牢的瞬間成黄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工逻杖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留奋岁,地道東北人。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓荸百,卻偏偏與公主長得像闻伶,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子够话,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內(nèi)容