高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支持。因此请确保存在这些设置。
<span style="color:#404244"><span style="color:#ffffff"><键><span style="color:#ffffff"> NSPrincipalClass </span>< /键> <字符串><span style="color:#ffffff"> NSApplication </span>< /字符串> <键><span style="color:#ffffff"> NSHighResolutionCapable </span>< /键> <字符串><span style="color:#ffffff"> True </span>< /字符串></span></span>
较新版本的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开始,可以通过平台插件的参数指定此级别:
<span style="color:#404244"><span style="color:#ffffff"><应用> <span style="color:#ffffff">-</span><span style="color:#ffffff">平台窗口:dpiawareness </span><span style="color:#ffffff">= </span><span style="color:#ffffff">0 </span><span style="color:#ffffff">,</span><span style="color:#ffffff">1 </span><span style="color:#ffffff">,</span><span style="color:#ffffff">2</span> </span></span>
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_EnableHighDpiScaling
Qt 5.6中引入的application属性可以根据监视器的像素密度自动缩放。Qt::AA_DisableHighDpiScaling
Qt 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之类的配置有关。可能的值是
Round
,Ceil
,Floor
,RoundPreferFloor
,PassThrough
。有关选项的完整说明,请参见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 | 通过将监视器的尺寸除以像素数获得的物理分辨率。 |
用户空间 | 应用程序在“设备无关像素”中使用的坐标空间。 |
高DPI显示---High DPI Displays相关推荐
- dpi和css,DPI和像素、厘米、英寸之间的关系和换算及CSS中的长度单位、位深度、ppi...
DPI和像素.厘米. 首先告诉大家一个不幸的消息:像素不能直接换算成英寸.厘米,要在dpi下才能换算! photoshop中两种分辨率换算 72像素/英寸=28.346像素/厘米 300像素/英寸=1 ...
- android 分辨率显示不全,安卓手机分辨率太高软件显示不全?任意软件全屏运行详细教程...
手机分辨率太高软件显示不全?教你瞬间让任意软件变全屏 如果你像白鸽一样使用高分辨率的安卓手机(比如Atrix 4G)或是平板电脑,就会发现很多软件居然不能全屏显示.面对这样的问题,传统的解决办法无外乎 ...
- 如何使软件适应高dpi显示环境
一.dpi介绍 dpi是"Dots Per Inch"的缩写,表示每英寸的像素点个数,也就是像素点的密集度. dpi = 总像素点 / 总面积 比如一个32寸的显示,但分辨率只有1 ...
- linux 修改分辨率lcd_Linux下LCD屏幕字体显示优化--dpi设置及sub-pixel次像素微调
新购买了22寸宽屏液晶,兴致勃勃搞起字体美化,首先从字体显示方面入手. (注:本文于7月26日修改.部分内容对普通CRT显示器可能也有效.) 一 计算最佳dpi 首先要知道显示器屏幕的高度和宽度.说明 ...
- win7系统显示中DPI缩放显灰处理
由于使用虚拟机,安装了win7系统,但在使用中,由于显示问题,导致部分软件显示比例失调.以前查了多次,都把处理办法给忘记了,今天做个记录. 将主题更改为Aero主题,便可以选择了.
- 设备像素比+图片高清显示+移动适配
可见视口:屏幕宽度(设备宽度) 布局视口:DOM宽度 理想视口:布局视口 = 可见视口 设备宽度与DOM宽度与scale的关系: 设备宽度 = DOM宽度 * scale 获取屏幕宽度(visual ...
- s5pv210 HDMI 1080P 高清显示
s5pv210 HDMI 1920x1080P@60Hz 显示 高清图片 s5pv210 可以设置成1920x1080P@60Hz显示,虽然datasheet并没有提供这种配置,因为1080P@60h ...
- vue图片在设置好的div里面自动适应宽高,显示全部图片,不够的留空白
vue图片在设置好的div里面自动适应宽高,图片显示全部,不够宽高的留空白 <div class="rightullidiv"><img:src="it ...
- matlab保存图片如何保证dpi,Matlab保存图片(dpi要求)
用print函数: 如:t=1:100 plot(t,sin(t)); print(gcf,'-dpng','sin.png'); 用saveas() 如:t=1:100; plot(t,sin(t) ...
最新文章
- redis 数据结构 内存管理 持久化
- UnboundLocalError: local variable ‘XXX‘ referenced before assignment解决办法
- 《Windows Phone 8 Development Internals》读书笔记-1-2-1-连载
- Greg and Array CodeForces - 296C(差分数组+线段树)
- Activiti工作流学习笔记01
- 火狐优化及遇到的问题
- c语言标准库函数fputs,C 库函数
- 行为识别论文笔记|ARTNet|Appearance-and-Relation Networks for Video Classification
- 唐山解封炉料大涨,PTA认购大涨,玻璃纯碱套利继续大跌2022.4.12
- NVIDIA驱动安装(arm64平台可用)
- javase学习——面向对象(下)
- 查询水果价格(PTA-武理-C实验)
- solidworks曲面圆角与特征圆角区别与误用
- 深度学习: Epoch 是什么?
- WINVNC源码分析(三)rdr
- 【微信小程序】文章点赞功能的实现
- Linux服务 Nginx(一)
- nginx的安装和html部署问题
- 描述并简要比较TCP/IP协议体系及0SI/RM协议体系
- 常用的BAPI 函数
热门文章
- mikrotik CAPsMAN设置教程
- html实现滑动解锁_js实现滑动解锁功能(PC+Moblie)
- Service的生命周期及handleMessage
- 性价比首选,百元旗舰级骨传导耳机——南卡Runner CC3实战评测
- I won't give up, I won't break down
- ironpython安装_安装 IronPython
- 陶哲轩破解数十年前几何猜想,用反例证明它在高维空间不成立,同行:推翻的方式极尽羞辱...
- 面试官:介绍下Spring MVC
- FAE新手上路(二)
- 如何在SQL中设置自动编号