高DPI显示---High DPI Displays

与标准DPI显示器相比,高DPI显示器具有增加的像素密度。

像素密度以每英寸点数(DPI)或每英寸像素数(PPI)度量,并由显示像素的数量及其大小确定。因此,仅像素数量不足以确定显示器是否属于高DPI类别。

4K显示器具有固定数量的像素(〜8M),但是其DPI在185(23英寸)和110(40英寸)之间变化。前者大约是标准96 DPI桌面分辨率的两倍;后者几乎不超过该分辨率。

高DPI带来的挑战

高DPI显示给现有应用带来了一些挑战:

  • 使用具有固定坐标的UI设计的应用程序看起来很小
    以点为单位指定字体大小和以像素为单位指定其他大小的组合特别有问题,因为点与显示器的分辨率无关。例如,假设我们在文本“ hello”周围有一个40x20像素的框架。如果我们使用12pt字体,则在低分辨率显示器上看起来正确。但是,在高DPI监视器上,框架可能太小,导致文本被剪切。
  • 应用程序必须适应用户具有分辨率不同的多个显示器的情况
    。例如,用户可能将4K监视器用于图像编辑器的文档窗口,而将低分辨率监视器用于工具箱。

传统上,为了支持高DPI,Qt会自动缩放字体并提供DPI值,应用程序代码可使用该值来缩放UI的其余部分。

系统级的高DPI支持

Qt支持高DPI模式,其中虚拟主坐标系并使其独立于显示像素密度。某些操作系统(如macOS和iOS)实现此模式。此外,如果操作系统不支持此模式,则Qt可以回退。

现在,以与设备无关的像素指定几何形状。这包括小部件和项目的几何形状,事件的几何形状,桌面,窗口和屏幕的几何形状以及动画速度。输出以设备像素表示,该像素对应于显示分辨率。该devicePixelRatio是设备无关的像素和所述装置中的像素的坐标系之间的比率。

通常,大多数应用程序使用与设备无关的像素。除了OpenGL和用于光栅图形的代码。

操作系统支持

Qt支持的操作系统为高DPI显示提供以下功能:

macOS和iOS

Apple平台在操作系统中实现扩展和协调系统虚拟化。通常,不需要特殊配置。

在macOS上,通过Info.plist文件中的设置启用了高DPI支持。因此请确保存在这些设置。

<键> NSPrincipalClass < /键> <字符串> NSApplication < /字符串> <键> NSHighResolutionCapable < /键> <字符串> True < /字符串>


较新版本的qmake将生成Info.plist带有NSPrincipalClass键的文件;这是足够的,因为默认情况下NSHighResolutionCapable为true。

注意: macOS和iOS均可应用进一步的虚拟化,因此设备像素不再对应于显示像素1:1。在iPhone 6+和配置了“显示比例”的macOS上会发生这种情况。

微软Windows

缩放比例

用户可以从“ 控制面板”或上下文菜单中选择比例因子。通过使用于查询系统指标的函数返回标准字体大小,窗口边框大小等不同的值来起作用。它不执行任何实际缩放。

DPI意识

Windows上的应用程序可以采用以下“ DPI意识”级别之一:

DPI意识等级 含义
DPI未知 此级别是Windows Vista中引入的。对于该应用程序,Windows假装它好像在96 DPI 1920x1080的标准显示器上运行,并相应地缩放应用程序。它旨在适应为低DPI显示器设计的较旧的应用程序。这种缩放比例可能会导致某些伪影。
系统DPI感知 此级别是Windows Vista中引入的。仅当连接了多台显示器时,它才与Per-Monitor DPI Aware有所不同。Windows计算出适合所有连接的监视器的缩放比例。
每个显示器的DPI感知 Windows 8.1中引入了此级别。Windows根本不执行任何缩放。

默认情况下,Qt应用程序在Windows 8.1上设置为“ 每显示器DPI感知”,在旧Windows版本上设置为“ 系统DPI感知 ”。从Qt 5.4开始,可以通过平台插件的参数指定此级别:

<应用> -平台窗口:dpiawareness = 0 1 2 

Qt中对DPI的高度支持

Qt为您提供了以下方法来处理应用程序中对DPI的高支持。

  • 提供高分辨率的像素图或图稿的能力。有关更多详细信息,请参见绘制高分辨率版本的Pixmap和图像。
  • Qt 5.6支持旧应用程序的跨平台高DPI缩放,类似于macOS本身进行的缩放。这样,为低DPI屏幕编写的应用程序就可以在高DPI设备上不变地运行。此功能是可选功能,可以使用以下环境变量启用它:
    • QT_AUTO_SCREEN_SCALE_FACTOR[boolean]启用基于监视器像素密度的自动缩放。因为point是物理度量单位,所以这不会更改磅号字体的大小。多个屏幕可能会获得不同的比例因子。
    • QT_SCALE_FACTOR [数字]定义整个应用程序的全局比例因子,包括点大小的字体。
    • QT_SCREEN_SCALE_FACTORS[列表]指定每个屏幕的比例因子。这不会更改磅号字体的大小。环境变量主要用于调试或解决带有错误EDID信息(扩展显示标识数据)的监视器。

      格式可以是与QGuiApplication :: screens()相同顺序的以分号分隔的比例因子列表,也可以是与QScreen :: name()相同的name=value对的分号分隔列表。name

    尽管macOS样式完全支持高DPI,但Windows桌面样式当前在某些比例因子上有一些限制。在这些情况下,请考虑改用Fusion样式,该样式在所有情况下都支持高DPI。

    注意:非整数比例因子可能会导致明显的比例/绘画瑕疵。

  • Qt::AA_EnableHighDpiScalingQt 5.6中引入的application属性可以根据监视器的像素密度自动缩放。
  • Qt::AA_DisableHighDpiScalingQt 5.6中引入的application属性关闭所有缩放。这适用于需要实际窗口系统坐标的应用程序,而不管环境变量如何。此属性的优先级高于Qt :: AA_EnableHighDpiScaling。
  • Qt 5.14中引入的QT_ENABLE_HIGHDPI_SCALING环境变量可根据监视器的像素密度自动缩放。替换QT_AUTO_SCREEN_SCALE_FACTOR。
  • Qt 5.14中引入的QT_SCALE_FACTOR_ROUNDING_POLICY环境变量和QGuiApplication :: highDpiScaleFactorRoundingPolicy API使控制设备像素比率是否以及如何舍入到最接近的整数成为可能。这与150%规模的Windows之类的配置有关。可能的值是RoundCeilFloorRoundPreferFloorPassThrough。有关选项的完整说明,请参见Qt :: HighDpiScaleFactorRoundingPolicy枚举文档。
  • 在Qt 5.4中,通过QT_DEVICE_PIXEL_RATIO环境变量引入了DPI高比例缩放的实验性实现,您可以将其设置为数字比例因子或auto。此变量在Qt 5.6中已弃用。

迁移现有应用程序

若要使设计用于低DPI值的应用程序快速在高分辨率监视器上运行,请考虑以下其中一项:

  • 让应用程序在Windows上以DPI Unaware的身份运行
  • QT_AUTO_SCREEN_SCALE_FACTOR环境变量设置为1

但是,这些选项可能会导致某些缩放或绘画瑕疵。

从长远来看,该应用程序应适于未经修改地运行:

  • 始终使用QPainter绘图API 的qreal版本。
  • 调整窗口和对话框相对于相应屏幕尺寸的大小。
  • 将布局和图形代码中的硬编码大小替换为根据字体指标或屏幕大小计算出的值。

高DPI术语表

术语 定义
设备无关像素 应用程序使用的像素(用户空间),取决于操作系统或Qt的缩放比例。
设备像素 显示设备的像素。
设备像素比 适用于操作系统或Qt的比例因子。
逻辑DPI 用于将以磅为单位定义的字体大小转换为以像素为单位的字体大小的分辨率。标准值为96、128,... 192。
物理DPI 通过将监视器的尺寸除以像素数获得的物理分辨率。
用户空间 应用程序在“设备无关像素”中使用的坐标空间。

你可能感兴趣的:(Qt,qt,DPI)