QT 如何支持高清屏,视网膜屏幕

2019独角兽企业重金招聘工程师标准>>>
Mac OS、iOS和X11的显示支持
星期四 五月 2nd, 2013 |Qi
原文链接: Johan S?rvig–for Mac OS, iOS and X11
Qt 5.0中添加了对于显示的基本支持 。即将到来的Qt 5.1中提供了新的API和缺陷修复,对于这一问题进行了改进 。Qt 4.8也获得了良好的支持,我们反向移植了一些Qt 5的补丁 。
尽管这些实现的努力和Mac以及iOS程序员最为相关,但是来看一看其它平台是如何处理高DPI显示这一问题,也是很有趣的 。这里主要有两种方式:
平台/API逻辑的物理的
HTML
CSS像素
设备像素
Apple

像素
密度无关像素(dp)
(屏幕)像素
设备无关像素(DIP)
物理像素
Qt(过去)
像素
像素
Qt(现在)
设备无关像素
设备像素
在历史上,Qt已经支持基于DPI缩放的物理像素这一方式 。在2009年时,对于上的高DPI值的支持已经有所改进 。Qt布局对于增加的DPI并没有考虑 。现在Qt 5添加了对于“新增像素”这一缩放类型的支持 。
(还有其它的高DPI实现么?欢迎大家在评论中进行指正 。)
Mac OS X的高DPI支持
OS X上高DPI模式的关键是,以前绝大多数几何信息都是通过物理像素给定的,现在却是设备无关点 。这包括桌面几何信息(例如15英寸的Pro是而不是全分辨率2880×1800)、窗口几何信息和事件坐标 。绘制引擎知道全分辨率并且针对这一解析度生成输出 。例如,对于普通屏幕和高DPI屏幕(其它参数都相同的情况下),一个的窗口在屏幕上占用的区域是一样的 。在高DPI屏幕的窗口后端存储包含了像素 。
这种模式的主要收益是向后兼容性以及自由的高DPI矢量图形 。对于底层情况不了解的应用程序可以简单地像以前一样工作在相同的几何情况下,并且保留写死的像素值 。同时,他们还可以使用如文本这样的矢量图形,而不用做任何修改 。光栅图形引擎不能获得自动改进,但这是可以实现的 。不好的一点是在代码中使用点和像素的时候,有不可避免的坐标系统混淆 。
点到像素的缩放因子总是2x 。在改变屏幕分辨率的时候,这一情况也是真的——点和像素总是被一个值同时缩放 。当使用“More Space”进行缩放的时候,应用程序将会被渲染到一个大的后端存储,这个后端存储会被再缩小到物理屏幕解析度上 。
在Mac OS上缩放用户界面解析度
如果您手里没有硬件,在使用外部显示器的时候,有一种仿真模式还是很有用的 。打开显示器()属性并且选择一种HiDPI模式 。(如果没有,请查看上的这个问题 。)

QT 如何支持高清屏,视网膜屏幕

文章插图
为OS X应用程序启用高DPI
高DPI模式是通过Info.Plist文件中的这些键值控制的:
NSPrincipalClassNSApplicationNSHighResolutionCapableTrue
qmake将会为您添加这些内容 。(严格意义上说,它将会只添加,ble是可选的并且默认值为true) 。
如果ble被设置为false,或者缺少这些键值,那么应用程序将会被按“普通”解析度渲染然后放大 。这样的结果看起来很糟糕并且应该避免,特别是因为高DPI模式是非常向后兼容的,并且应用程序可以获得很多高DPI支持而不用做任何修改 。
缩放的Qt
QT 如何支持高清屏,视网膜屏幕

文章插图
高DPI的Qt
(除了一个更新“模式”图标的补丁之外,没有其它修改了 。)
Qt的实现细节
Mac OS 10.8(10.7是非正式的?)添加了对高DPI的显示的支持 。Qt 4免费获得这一支持,因为它使用的是绘制引擎 。