Qt 使用全局缩放进行全分辨率适配(QT_SCALE_FACTOR)

摘要:
这是有原因的,因为我们现在正在进行的一个项目是全屏显示。因此,不同的屏幕分辨率对程序界面有很大的影响。在设计UI时,我们没有过多地考虑自动布局。尽管在界面开始时已尽可能使用自动布局,但某些控件提供的图像大小并不合适,您只能为控件设置固定大小。当测试不同分辨率时,发现界面显示不同的效果。因此,我们开始寻找解决方案适应的方法。我无意中忘记了我在找什么。应该是高分割屏幕

事出有因
  因为现在做的一个项目是全程全屏显示的。因此不同屏幕分辨率对程序界面的影响太大。而UI设计的时候又没有过多的考虑自动布局这方面的事。
  虽然在刚开始做界面的时候已经尽量利用自动布局来做,但是有些控件提供的图片大小不太合适,在做的时候只能给控件设置固定大小。在测试不同分辨率的时候发现界面展现的效果不同。于是就开始想办法做分辨率适配。

偶然事件
  具体忘记当时在搜索什么东西了,大概应该是高分屏适配的问题。在qt的一篇官方文档中发现了这个好东西:

QT_SCALE_FACTOR [numeric] defines a global scale factor for the whole application, including point-sized fonts.

QT_SCALE_FACTOR
  它是一个QT的环境变量,看它的字面意思是缩放因子或者叫缩放系数。
  这东西咋用的呢?看一段示例代码:

qputenv("QT_SCALE_FACTOR", "2.0");

  就这么简单。但是有个条件,就是这句代码需要放再QApplication实例初始化之前。
它有什么效果呢?
  它是用来控制整个程序界面的所有元素的缩放比例的一个环境变量。上面这句代码的效果就是将整个界面放大为原来的2倍。
来看效果:

Qt 使用全局缩放进行全分辨率适配(QT_SCALE_FACTOR)第1张

 Qt 使用全局缩放进行全分辨率适配(QT_SCALE_FACTOR)第2张

怎么用呢

  从上面两张图可以看出来,在缩放的时候是整个界面进行缩放的。不管是pt单位还是px单位都进行了缩放 。
那么代码就可以这样写。

1     //这个是Windows平台用来获取屏幕宽度的代码,
2     //因为在qApplication实例初始化之前,QGuiApplication::screens();无法使用。
3     qreal  cx = GetSystemMetrics(SM_CXSCREEN);
4     qreal scale = cx / 960;                // 960 = 1920 / 2
5     qputenv("QT_SCALE_FACTOR", QString::number(scale).toLatin1());

  上面代码大概意思就是通过对比当前屏幕的分辨率和设计分辨率(960×540)来确定程序的整体缩放比例。
  这样无论在哪种分辨率情况下界面展现的效果都是一样的。
备注:
  为什么设计分辨率是960×540。因为它是1920×1080的一半。而现在设备的常用分辨率基本上都是1920×1080;更重要的是我自己的电脑分辨率就是1092×1080,因此我的界面设计的时候就是按照1920×1080分辨率设计的。这样的话我只需要将界面上所有元素的大小减半就行了。另外一个重要的原因就是缩放系数不能小于1.0,不然会出bug,至于到底会发生什么,自己试试就知道了。

后遗症
  通过上面两张图,你会发现这个全局缩放引发了两个问题:

  图片放大的时候有锯齿。
  字体在缩放的时候质量不太好。
因此需要另外两个东西来解决这两个问题。

调整图片缩放质量

1 //控制图片缩放质量
2 QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
3 QCoreApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);

文字质量
  这需要使用另外一个东西”qt.conf“。
内容如下。

1 [Platforms]
2 WindowsArguments = fontengine=freetype

将这个文件放入程序的资源中。路径为":/qt/etc/qt.conf"

来看效果:

Qt 使用全局缩放进行全分辨率适配(QT_SCALE_FACTOR)第3张

注意事项
  缩放系数必须大于等于1.0,不然会出现一些奇怪的问题。而且必须是小数形式的字符串。即使缩放系数经过计算后是整数也要写成小数形式。即1920/960 = 2要写成2.0传递进去。
至于获取屏幕尺寸的问题,有些代码提供了一个思路,就是先初始化一个临时的QApplocation获取到屏幕大小后再释放掉,我不建议这么做,因为在我的项目中这样做引起了一些bug,偶尔会闪退。建议自己根据平台不同多写几行代码。

免责声明:文章转载自《Qt 使用全局缩放进行全分辨率适配(QT_SCALE_FACTOR)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇windows下的SASS/Compass的安装与卸载java 解析/读取 种子/bt/torrent 内容下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

C# WinForm在高分辨率下界面模糊问题的解决

前言 昨天刚搞定了DevExpress,今天就遇到了之前遇到过的一个问题,那就是WinForm在高分辨率下界面模糊。我的开发环境是Windows10 64位和VS2010,电脑屏幕分辨率为1920*1080,采用的是WinForm程序设计方法开发。在程序运行时遇到了这样一个问题,在VS设计的很清晰的菜单和界面,运行的时候菜单和控件上字体变得很模糊,界面大小...

(全解析)屏幕尺寸,分辨率,像素,PPI之间到底什么关系?

(全解析)屏幕尺寸,分辨率,像素,PPI之间到底什么关系? 产品经理马忠信关注 22015.08.30 13:59:20字数 2,660阅读 52,661 今天我给大家来讲讲这几个咱们经常打交道的词到底啥意思,以及他们之间到底有什么关系。这篇文章是我花了一个下午从N多篇文章里提炼出的一个白话版,保证让你看得懂。 咱们从手机开始说起吧。先上一张图,给...

怎样为virtualbox添加新的分辨率

virtualbox是个相当NB的开源跨平台虚拟机软件,只是新创建的虚拟机仅仅支持几种分辨率。比如。安装win8.1,仅仅有例如以下图的几种分辨率。 只是我的显示器是5K哦,这么点分辨率,简直是搞笑。可惜,virtualbox的GUI并没有提供加入分辨率的功能,只是却提供了命令行工具来加入不论什么大小的分辨率。比如,要加入一个2560*1440的分辨率...

android 手机分辨率

QVGA(Quarter VGA):其分辨率为240×320像素,是当下智能手机最常用的分辨率级别。240×320像素的意思就是,手机屏幕横向每行有240个象素点,纵向每列有320个象素点,乘起来就是320×240=76800个象素点。早期的智能手机也大都采用这一显示级别的屏幕。WQVGA(Wide QVGA):分辨率为240×400或者240×432HV...

Android屏幕适配总结

一、首先需要明白的几个概念  1、屏幕尺寸:也就是我们平常所说的某某手机几寸屏。比如苹果的4.7寸, 荣耀6的5.5寸。这里说的寸是英寸(1 英寸 = 2.54 厘米)。       计算方法:屏幕尺寸=对角先尺寸(cm) / 2.54(cm)              一般用英寸表示。1英寸=2.54cm           2、分辨率:屏幕上显示的像...

解决自定义相机分辨率适配、扭曲的问题

在自定义相机和扫码的时候,如果不设置相机的默认分辨率,有可能导致相机用的是最小的分辨率,照出来的照片很模糊。 所以自定义相机的时候,需要获取屏幕分辨率,相机的预览分辨率,进行最佳的匹配。 由于相机的预览分辨率几乎都是 按照横屏的来描述的,eg 1920*1080 而手机一般是竖屏的,如果自定义的相机是竖屏的,匹配相机预览分辨率的时候,如果直接传入当前的屏幕...