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


Qt 5使用的是光栅绘制引擎并且Qt通过缩放绘图器变换()实现了高DPI矢量的绘制 。同时为Qt 4和5提供了高DPI的Mac风格 。在Qt 5的风格中,对于高DPI模式的支持也已经修改好了 。
是一种基于设备像素的API并且对于高DPI模式也仍然如此 。在中有一个flag可以用来开启或者禁用2x缩放——Qt在所有情况下都可以设置它 。运行在设备像素中 。
Qt Quick 1是构建于之上的,它是一个并且通过获得对于高DPI的支持 。
Qt Quick 2是基于Scene Graph(和),已经更新了高DPI的支持 。Qt Quick控件(也就是以前的 )也已经更新了在高DPI模式下的渲染,其中包括距离场( field)文本渲染 。(译者注:关于距离场,可以参考Yoann Lopes – Textin the QML Scene Graph以及iKDE上的译文 。)
这里的卖点是应用程序开发人员不需要关心这些,您只需要在设备无关像素的空间里舒适地开发,Qt和/或OS会为您处理那些复杂的事情 。但有一个例外,光栅内容( )——需要提供高DPI光栅内容,并且应用程序代码需要正确处理这些内容 。
窗口部件和绘图器
代码绝大多数情况下都和原来一样 。我们来看看绘制渐变()的代码:
QRect destinationRect = ...QGradient gradient = ...painter.fillRect(rect, QBrush(gradient));
在高DPI显示器上,这个渐变在屏幕上的大小还是一样的,但是被填充了更多的(设备)像素 。
绘制一个像素映射()也是类似的:
QRect destinationRect = ...QPixmap pixmap = ...painter.drawPixmap(destinationRect, pixmap);
为了避免在高DPI显示器上出现缩放失真,像素映射必须包含足够的像素:两倍于的宽和高 。应用程序可以直接提供它们,也可以使用QIcon来管理不同的解析度:
【QT 如何支持高清屏,视网膜屏幕】QRect destinationRect = ...QIcon icon = ...painter.drawPixmap(destinationRect, icon.pixmap(destinationRect.size()));
QIcon::()已经被修改了,可以在高DPI系统中返回一个更大的像素映射 。这种行为的改变会破坏现有的代码,所以它是由这个应用程序属性来控制的:
qApp->setAttribute(Qt::AA_UseHighDpiPixmaps);
在Qt 5.1中这个属性默认值是关闭的,但在未来的Qt发布中它很有可能默认为打开 。
极端情况和
Qt的窗口部件有一些极端情况 。在理想情况下,它一直使用QIcon,并且在绘制的时候会使用正确的像素映射,但是实际情况是Qt API经常直接生成和使用像素映射 。当像素映射的大小被用来计算布局的几何信息时,会发生错误——如果一个像素映射已经是高分辨率的,那么在屏幕上它就不应该再占用更多的空间 。
通过使用::(),就能让的像素映射实际占据的设备无关像素 。由QIcon::()返回的像素映射中已经设置好了 。
例如就是一个“像素映射消费者”:
QPixmap pixmap2x = ...pixmap2x.setDevicePixelRatio(2.0);QLabel *label = ...label->setPixmap(pixmap2x);
然后会除以来获得布局的大小:
QSize layoutSize = pixmap.size() / pixmap.devicePixelRatio();
与此类似的几种情况在Qt中都已经修复,并且应用程序代码在启用之前也需要做类似处理 。
下面几个Qt类中都提供了()的读写函数:
类注释
::()
推荐使用的读写函数
::()
::()
如果没有指针,请使用这个
::[set]()
::[set]()
文本
字体大小还可以和原来一样,会在高DPI显示中产生类似的大小(但会有一点小问题) 。字体的像素大小是设备无关的像素大小 。您在高DPI显示中永远不会得到太小的文本 。
是在设备像素空间中工作的 。例如,传递给的宽和高应该是设备像素 。::()中的宽和高也是设备像素的 。