本文的参考链接 High DPI Displays
高 DPI 显示器##
高 DPI 显示器是与标准 DPI 显示器相比具有增加的像素密度的显示器。
该像素密度以每英寸点数(DPI)或每英寸像素数(PPI)测量,并且由显示像素的数量和物理尺寸确定。这意味着仅凭像素数量不足以确定显示器是否属于高 DPI 类别。
4K 显示器具有固定数量的像素(约 8M),然而其 DPI 在 185(23英寸)和 110(40英寸) 之间变化。前者是大约 2x 标准的 96 DPI 桌面分辨率,而后者几乎没有超过它。
高 DPI 存在的问题##
高DPI显示器会对现有应用程序造成许多问题:
- 使用固定坐标的 UI 设计的应用程序看起来很小。 Text 大小以点大小设置和但是其他属性尺寸使用像素设置的组合是特别有问题的,因为点大小是与显示器的分辨率无关的。这种情况下,在低 DPI 显示屏上看起来正确的字符串的范围可能在高 DPI 显示屏上变得太小,因此导致文本被剪切而显示不全。
- 应用程序必须适应用户具有不同分辨率的多个显示器的情况。 例如,他们可能会使用 4K 显示器作为图像编辑器的文档窗口,同时使用一个低分辨率显示器作为工具箱。
支持高 DPI 的传统方法是 Qt 自动缩放字体,然后提供应用程序代码可用于扩展 UI 的其余部分的 DPI 值。
Qt 高 DPI 支持概述##
Qt 支持高 DPI 模式,主坐标系虚拟化,独立于显示像素密度。这种模式是由某些操作系统(macOS,iOS)实现的。此外,Qt 包含一个可能在缺少操作系统支持的地方使用的实现。
现在 Geometry 在设备无关的像素中指定。这包括 widget 和 item geometry,event geometry,desktop, window 和 screen geometry 以及动画速度。渲染输出处于设备像素中,对应于显示分辨率。设备和设备像素坐标系之间的比是 devicePixelRatio。
应用程序主要使用与设备无关的像素。 值得注意的例外是 OpenGL 和与光栅图形一起使用的代码。
操作系统支持##
Qt 支持的操作系统为高 DPI 显示屏提供以下支持:
macOS 和 iOS####
苹果平台在操作系统中实现缩放和协调系统虚拟化。通常,不需要特殊配置。
注意:在macOS上,通过 Info.plist 文件中的设置启用了高 DPI 支持。 确保它们存在:
NSPrincipalClass
NSApplication
NSHighResolutionCapable
True
没有qmake的版本将使用NSPrincipalClass密钥生成Info.plist,这是因为默认情况下NSHighResolutionCapable为true。
注意:macOS和iOS可以应用更多的虚拟化,使得设备像素不对应于1:1来显示像素。 这种情况发生在iPhone 6+和配置了“显示缩放”的macOS上。
Microsoft Windows####
缩放
用户可以从控制面板或通过上下文菜单选择缩放系数。 这通过使用于查询系统度量的函数返回标准字体大小,窗口边框大小等的不同值。 它不执行任何实际缩放。
DPI Awareness
Windows上的应用程序可以采用以下级别的“DPI Awareness”:
DPI Awareness 级别 | 说明 |
---|---|
DPI Unaware | 此级别已在Windows Vista中引入。 Windows将假装运行在96 DPI 1920x1080的标准显示器上的应用程序,并相应地缩放应用程序。 它旨在适应设计用于低DPI显示器的旧应用程序。 某些工件可能由此类型的缩放产生。 |
System-DPI Aware | 此级别已在Windows Vista中引入。 只有连接多个显示器时,它与每个监视器DPI Aware不同。 Windows将计算适用于所有连接的显示器的缩放比例。 |
Per-Monitor DPI Aware | 此级别已在Windows 8.1中引入。 Windows根本不执行缩放。 |
默认情况下,Qt 应用程序是Windows 8.1上的Per-Monitor DPI Aware或Windows早期版本上的System-DPI。从Qt 5.4开始,可以通过将参数传递给平台插件来指定级别(请参阅 Using qt.conf):
-platform windows:dpiawareness=0,1,2
Qt 中的高 DPI 支持##
一、能够提供高分辨率的像素图或艺术品:具体可查看 Drawing High Resolution Versions of Pixmaps and Images.
二、 Qt 5.6 支持传统应用程序的跨平台高 DPI 缩放,类似于 macOS 本地化的缩放。这允许为低 DPI 屏幕编写的应用程序在高 DPI 设备上运行不变。此功能是可选的加入,可以通过以下环境变量启用:
- QT_AUTO_SCREEN_SCALE_FACTOR [boolean] 基于显示器的像素密度实现自动缩放。 这不会改变点大小字体的大小,因为点是物理单位。 多个屏幕可能会获得不同的比例因子。
- QT_SCALE_FACTOR [numeric] 定义整个应用程序的全局比例因子,包括点大小的字体。
- QT_SCREEN_SCALE_FACTORS [list] 指定每个屏幕的比例因子。 这不会改变点大小字体的大小。 此环境变量主要用于调试,或者用于具有错误的 EDID information 的显示器(扩展显示标识数据)。
格式可以是分号分隔的比例因子列表,它们与QGuiApplication::screens 的顺序相同,也可以是分号分隔的 name = value 对列表,其名称与QScreen::name 相同。
虽然 macOS 风格完全支持高 DPI,但 Windows 桌面风格目前在某些比例因素方面存在一些限制。 在这些情况下,请考虑使用 Fusion 风格,其目的是在所有情况下支持高 DPI。
注意:非整数比例因子可能会导致显着的缩放/绘画伪影。
三、Qt 5.6中引入的应用程序属性 Qt :: AA_EnableHighDpiScaling 可以根据显示器的像素密度进行自动缩放。
四、在Qt 5.6中引入的应用程序属性 Qt :: AA_DisableHighDpiScaling 关闭所有缩放。 这适用于需要使用实际的窗口系统坐标的应用程序,无论环境变量如何。 此属性优先于 Qt::AA_EnableHighDpiScaling。
五、在Qt 5.4中引入了高DPI缩放的实验实现。 它由环境变量 QT_DEVICE_PIXEL_RATIO 启用,可以将其设置为数字比例因子或“自动”。 Qt 5.6中不推荐使用此变量。
迁移现有应用程序##
为了能够快速地将一个在低 DPI 设备上开发的应用快速地移植并运行在高 DPI 的设备上,考虑一个缩放选项(例如让应用程序在 Windows 上作为 DPI Unaware 运行,或将环境变量 QT_AUTO_SCREEN_SCALE_FACTOR 设置为 “1” )。但是,这些选项可能会产生一些缩放或重绘。
从长远来看,应用程序应适应运行时不修改:
- 始终使用 QPainter 绘图 API 的 qreal 版本。
- 尺寸与屏幕大小相关的窗口和对话框。
- 通过从 font metrics 或屏幕尺寸计算的值替换布局中的硬编码尺寸和绘制代码。
高 DPI 术语词汇表##
术语 | 说明 |
---|---|
Device Independent Pixels | 应用程序使用的像素(User Space),受操作系统或 Qt 的缩放。 |
Device Pixels | 显示设备的像素。 |
Device Pixel Ratio | 操作系统或 Qt 使用的缩放因子。 |
Logical DPI | 分辨率用于将以点为单位的字体大小转换为字体大小(以像素为单位)。 通常标准值之一为96,128,... 192。 |
Physical DPI | 通过将监视器的大小除以像素数获得的物理分辨率。 |
Retina Display | 可以查看维基百科中视网膜显示器词条 |
User Space | 应用程序使用的坐标空间(设备独立像素)。 |