Qt之高DPI显示器 - 解决方案整理

这篇具有很好参考价值的文章主要介绍了Qt之高DPI显示器 - 解决方案整理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

DPI发展

随着显示器质量的增高,高分屏逐渐增多,很多用户平时使用的机器都是2k屏甚至是4k屏。

显示器分辨率变大后,同样的物理尺寸下可以表示更多的点,也就是我们平时所说的像素。

误区说明

我们现在平时所说的软件像素应该是PPI(Pixels Per Inch),中文意思是每英寸像素数,而我们windows系统中修改的DPI其实就是这个PPI。

为什么会有这个误区呢?

答案:因为这个世界正在尽人类想象所能地使其变得难懂。

1、PPI

每英寸像素数,像素表示的是“图片的原色”,足够靠近你显示屏上的图片你就会看到他们:一排一排的小方块。换句话说,他们也是一个电子图片的最小可寻址单元。

其中每一个电子图片则是由更小的光学单元组成,这些光学单元就是红色、绿色和蓝色。

PPI的始作俑者

可悲的是,一些生产厂商将这些 sub-pixel 描述为“dot”,为什么这样认为呢?因为他和DPI的墨点工作方式相同,然后就是一顿商业互吹,用DPI来描述PPI就被开始误用了。

需要注意的是,pixel 是一个固定大小的物理物体,因此,一个屏幕上的 PPI 是固定的。大部显示器都是 66 - 130ppi。

PPI 和打印的目标

只有要打印出来时,设定 PPI 才有效。

在打印的过程中,所有在屏幕上组成图片的物理pixel都被转换成不同色调的小正方形,这些小正方形是另外一种“像素”,下文中都使用pixel-d来表示。

当打印时,如果增加图片的大小为300%,图片是放大了300%,但是图片的颗粒度更大了!如果想要清晰度不变,而大小发生变化,这个时候我们就需要修改PPI。

看一个图片打印的示例

图片尺寸 PPI 物理春 结果 打印机(DPI) 每英寸点数 总点数 结果
300px * 300px 10 30 * 30英寸 非常大 60 60 * 60 30 * 30 * 每英寸点数 非常虚
300px * 300px 300 1 * 1英寸 非常小 90 90 * 90 1 * 1 * 每英寸点数 细腻
300px * 300px 60 5 * 5英寸 可能合适 120 120 * 120 5 * 5 * 每英寸点数 非常细腻

对于最终的打印输出而言,将 PPI 输入认为是一种调节物理大小的方式,而不是分辨率。

PPI可以决定打印的大小,想要更加细腻的打印效果则是需要增加更多的pixel-d。

2、DPI

DPI 只是打印机的技术参数,就像是你电脑显示器的 pixel 分辨率。

比如说,你以 600 dpi 来打印一幅 150ppi 的图像,那么每个“pixel”将会包括16个 dot(600 dot/150 “pixel” = 4 x 4 / “pixel”)。

名称 说明
Inch英寸 物理单位,可以衡量显示器的物理大小
PPI每英寸像素数 物理值,由硬件厂商决定。表示每英寸下可以存储多少个光学单元
DPI每英寸点数 打印机单位,一个技术参数,代表打印机的好坏。通常来说,dot 矩阵打印机可打印的 dpi 范围为 60 - 90,喷墨打印机的 dpi 范围为 300 - 600,而激光打印机为 600 - 1800。
Resolution分辨率 显示器单位,描述每英寸像素数
windows系统DPI 个人理解:windows自己的一个标准,表示每英寸像素数,也就是PPI(显示器真正的PPI不支持修改);类似于打印时的DPI。一个技术指标或者参数

综上:对于我们软件开发来说,其实所说的像素大小都是指PPI,这里要区分不是显示器的固定PPI,windows系统上修改DPI时其实修改的系统模拟出来的PPI;就类似于我们打印图片时输出的PPI一样,可以决定图片打印的物理尺寸。

一、Win自适应系统

High DPI Desktop Application Development on Windows

总的来说可以用,但是会模糊。目前win10效果最好,基本清晰,但是还可以优化;win7系统上基本是糊的,如果您的产品是一个互联网软件,那么系统自适应绝对不是最佳方案。

二、Qt机制

要使用Qt高DPI缩放,首先得禁用系统缩放。

方式1: QApplication构造前设置Qt::AA_EnableHighDpiScaling属性

方式2: 设置环境变量QT_AUTO_SCREEN_SCALE_FACTOR为1

1、Windows系统DWM缩放

启用系统缩放时,由于使用的都是图片拉伸的方式则会产品模糊

--- DPI Unaware System DPI Awareness Per-Monitor and Per-Monitor (V2) DPI Awareness
含义 启用系统缩放 应用程序已在启动的显示器上支持高DPI,但是没有对其他显示器支持,也就是说请系统在其他显示器上帮我启用系统缩放 永远不要对我做虚拟化,因为我自己能搞定

启用系统DPI虚拟化,可以调用SetProcessDpiAwareness接口。该接口有一个枚举的参数类型PROCESS_DPI_AWARENESS,但是这个参数只有在Win8.1之后才有。

Win10上有一个增强型虚拟化,可以大大优化DWM效果。

Win7可以调用SetProcessDpiAware接口

2、 Qt适配高DPI

基于Qt5.7测试结果

--- Qt虚拟化 推荐度 系统虚拟化 推荐度
Win7 只能使用整数倍放大,效果会模糊 * 支持系统下拉框中的浮点缩放,图片会模糊(有些系统失效) **
Win10 只能使用整数倍放大,字体比较清晰,但是需要适配高DPI图片 **** 图片拉伸,启用了Win增强型DWM,效果还可以,但字体没有Qt适配清楚 **

基于Qt5.13测试结果

--- Qt虚拟化 推荐度 系统虚拟化 推荐度
Win7 同Qt5.7,但是显示有过好于Qt5.7 ** 同Qt5.7 **
Win10 支持系统自定义分辨率,例如125%、175%
在不同分辨率下分别启动软件后,在相同指定分辨率下显示大小不一样
例如:在分辨率125%下启动软件,此时不要关闭程序1并修改分辨率为150%,然后在启动一次软件为程序2,观察程序1和程序2的大小,发现不一大。
**** 同Qt5.7 **

我们的软件在Win10上会强制启用增强型虚拟户,需要对exe右键属性-兼容性-所有用户设置进行禁用

3、适配DPI结论

1、Qt5.7只支持整数比例缩放

  1. 100%:0-149%
  2. 200%:150%-249%
  3. 300%:250%-349%
  4. ...往后依次类推
  5. 100%DPI下启动程序,切换DPI时无法对已启动软件大小做出影响;反之如果非100%DPI启动程序则是正常的。

2、Qt5.13支持系统预定义缩放比例

  1. 100%:100%
  2. 125%:125%
  3. ...往后依次类推,如果自定义了缩放比,默认按250%(测试结果,不一定准,有待测试多个显示器)显示。但不同分辨率下启动同一个软件后(启动的软件不关闭切换分辨率),在最后切换的分辨率上观察程序,大小都不一样。

Qt5.7和Qt5.13都有的问题

100%DPI启动软件后,再次修改DPI时,软件大小不会再次发生变化。

到这这里高DPI测试基本结束,综合各种情况,得出如下两个结论

  1. 高DPI适配使用Qt来做。Qt支持高DPI比windows系统缩放效果要好。
  2. Qt使用5.7。升级Qt到5.13时,需要升级vs至少到2015,并且软件只能是x64版本的,否则还需要升级工具到更高版本,并且我们的依赖库也可能需要重新编译,成本较高,而且5.13支持高DPI比5.7多的地方我们暂时可以不需要(主要是支持系统定义好的浮点缩放),因此不做Qt升级工作。

三、Qt适配

由于升级到5.13有很多成本,暂且使用Qt5.7进行适配

使用Qt5.7适配高DPI

缺点请看一节第三小节中Qt5.7只支持整数比例缩放

决定使用Qt5.7适配高DPI后,我们需要干如下几件事:

  1. 原生放大比例和web放大比例统一
  2. 系统DPI修改时,禁用刷新
  3. 添加不同DPI下图片

1、统一比例

100% 200%

2、强制刷新

WM_DPICHANGED

接收系统DPI发生变化消息

3、图片适配

添加不同DPI下图片

Qt适配完之后还是存在一些问题,比方说只支持系统已有缩放比,不能支持任意比例缩放,而且有时候还存在刷新问题、软件异常放大等等。

四、自己适配

业务层不需要考虑scale,只需要使用T打头控件开发即可。

注:由于篇幅的缘故,T打头的控件下一篇文章讲解

适配项目

  1. 窗口大小
  2. 字体大小
  3. 间距
  4. 图标

1、窗口大小

重写顶层窗口设置界面大小函数

setFixedWidth
setFixedHeight
......

动态调整

记录调用了哪些设置大小的函数,在dpi发生变化时重新设置一遍

if (testflag("setfixedWidth"))
{
    setFixedWidth(width * scale);
}

2、字体大小

重新生成qss文件

读取原有qss文件,使用正则表达式生成scale版本的新qss文件。

3、间距

布局的margin

记录调用了哪些设置大小的函数,在dpi发生变化时重新设置一遍,类似于窗口大小变化时所作调整

if (testflag("margin"))
{
    setContextMargin(...);
}

padding和margin

读取原有qss文件,使用正则表达式生成scale版本的新qss文件。

4、图标

工程中需要添加1x 2x 3x等不同分辨率的图标,1x图标为正常情况下使用的图标,2x和3x图标分别是高分辨率下的图标

替换图标有两种情况,一种是使用qss方式贴图,另一种是自绘贴图

qss方式

预先生成高分辨率下的整数倍xxx_2x.qss和xxx_3x.qss文件,实际使用的时候在动态调整,具体方案下一篇文章讲解

自绘文章来源地址https://www.toymoban.com/news/detail-445176.html

到了这里,关于Qt之高DPI显示器 - 解决方案整理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • DP1.4接口换新显示器开机无Logo、进主板BIOS黑屏解决方案

    今天更换高刷显示器后,发现开机主板Logo不显示,然后重启进BIOS就黑屏 换回老显示器可正常进入系统与BIOS 一开始以为是开XMP导致的,实则是因为过时的显卡 显卡过老就会出现以上问题,因为旧显卡BIOS不支持DP1.3/1.4 当然刷BIOS有风险, 请保证刷BIOS过程中不能断电! ,否则

    2024年02月10日
    浏览(171)
  • 中柏 EZpad 8 Windows 平板电脑 |驱动备份|系统优化|不能调节显示器亮度|进入Bios/uefi 快捷键 |蓝牙扫描不到设备|CPU占用过高解决方案

              之前一直使用的这个平板,但是有个很严重的问题就是性能实在太差了,每次都是CPU百分百,Mem 百分之50% 这个结果真的很意外, 但是又无可奈何,后面花时间做了一些优化包括 进程限制  启动优化  内存页面优化  但结果都不尽人意,一启动程序就卡顿 ..........  中间又

    2024年02月09日
    浏览(117)
  • 显示器方案

    首先显示器的种类很多,有桌面显示器,便携显示器,智能显示器,甚至AR眼镜也可以算是一个微型显示器。以往的显示器传输视频信号多为VGA和HDMI,当然DP也有,只是占少数,再早之前还有模拟信号接口等等,随着科技的进步,显示器的接口也用上了Type-C接口,相较于传统接

    2024年02月13日
    浏览(45)
  • Qt怎么获取显示器分辨率

    您可以使用QScreen类来获取当前显示器的分辨率。以下是一个示例代码: 上面的程序将输出主屏幕的分辨率。 如果您有多个显示器并且需要获取其中一个的分辨率,则可以使用QDesktopWidget类。下面是一个示例代码: 上面的程序将输出第2个屏幕的分辨率。请注意,屏幕编号从

    2024年02月13日
    浏览(51)
  • Type-C接口在显示器上有什么作用?Type-C 显示器方案介绍

    1·只可以用来充电,也是Type-C的第一特性。 如果你的显示器或手机电脑pad或扩展坞或充电器或数据线的Type-C,没有特别说明支持传输数据,那么往往仅仅能用来充电,里面起作用的说Type-C口里带了PD快充充电协议,至于能提供多少瓦,是100瓦还是80哇45瓦,就看各个厂商在PD

    2024年02月08日
    浏览(56)
  • QT Creator写一个简单的电压电流显示器

    本文主要涉及上位机对接收的串口数据处理,LCD Number控件的使用。之前的一篇写一个简单的LED控制主要是串口发出数据,这里再看一下怎么接收数据处理数据,这样基本就对串口上位机有简单的认识了。 这一小节通过用一个LCD Number实时显示时间的例程认识一下LCD Number控件。

    2024年02月11日
    浏览(45)
  • 桌面显示器type-c接口方案

    在当今时代,TYPE-C接口桌面显示器已经成为了我们生活和工作中不可或缺的重要设备之一。与传统显示器相比,新型的TYPE-C接口桌面显示器具有更多的功能和优势,其中最显著的特点就是支持视频传输和充电功能。 首先,TYPE-C接口桌面显示器在视频传输方面表现出色。由于支

    2024年01月19日
    浏览(51)
  • 【Qt】根据界面所在显示器自适应调整ui大小

    使用QDesktopWidget、QApplication::screens()等获取屏幕宽高、DPI等信息,详见上一篇概述。 我们需要将窗口、布局和控件的大小类型(size type)设置为相对单位,如: 设置窗口的尺寸策略为Qt::SizePolicy::Expanding 使用setBaseSize() + setSizeIncrement() 使窗口大小可根据屏幕比例增长 使用 percentages 而

    2023年04月26日
    浏览(38)
  • 桌面显示器type-c接口方案6020

    TYPE-C接口桌面显示器,与传统的显示器不同的是 新一类的显示器不仅仅支持视频传输,还可以利用显示器的DC电源转成PD协议充电给设备端(笔记本,任天堂等HOST设备)充电。 这种新型的TYPE-C接口桌面显示器,不仅在视频传输方面表现出色,更在充电方面带来了极大的便利。

    2024年01月17日
    浏览(48)
  • Type-C PD显示器方案简介

    LDR6020 Type-C PD显示器方案可以给显示器提供一个全功能C口,支持手机,电脑,游戏主机等一线投屏功能,同时支持PD快充输出。LDR6020内置了 USB Power Delivery 控制器和 PD BMC PHY 收发器,支持PD2.0/3.0等快充协议,单芯片完成 Alternate Mode协商、PD快充输出。另外LDR6020支持 USB 口升级

    2024年02月10日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包