当前位置: 首页 > news >正文

[旧日谈]高清画面撕裂问题考

背景

无边框透明背景透明的窗口,在随着缩放比例非整数倍数放大时的画面发生了露底、撕裂问题。
当我们在使用Qt开发的时候,遇到了一个结构性问题。因为我们的软件是自己做的,所以要自己定义标题栏,所以我们设置了软件为FrameLessWindowhint 和 setAttributes(Qt::WA_TranslucentBackground);,这是非常常见的窗口对吧。但是,当我们面对软件需要随着当前系统的缩放比例(DPI)的变化而变化,这个时候就会出现画面撕裂的问题

缩放比例设置:

缩放比例设置

当我把画面整体放大调整到1.25倍,即DPI修改到125%的时候,画面变成了如下情况:

画面撕裂示例:

在很多可移动控件之间出现了露底、画面撕裂的问题,非常影响用户体验和工程验收。

原理

为了解决这个问题,我们首先得明白为什么会发生这个问题。

我们假设现在有一个111px x 111px的窗口,当系统DPI为100%的时候,这个窗口在屏幕上显示的大小是111px x 111px。

现在我们将这个窗口放大到原来的125%大小,那么会发生什么?

问题来了,Qt中的窗口,是不支持小数位的,也就是说不存在这么一个12.5px x 12.5px的窗口,那么这个窗口在屏幕上显示的大小是多少呢?

这里我使用qputenv(“QT_SCREEN_SCALE_FACTORS”, “1.25”);强行改变了DPI,然后运行程序,再来使用截图工具来看看这个窗口的具体大小

这个时候这个窗口已经变成了139px了,也就是说这个窗口平白无故多了0.25个像素。当然了,在这样一个画面上看不出什么问题,我们往上面添加一些控件,再来看看效果。

不出所料,这个控件就已经发生了透底(画面撕裂)问题了,因为实际上这个控件的界面大小是错误的,并不是准确的,中间多出来的半个像素,导致了qt整个界面的撕裂问题。

解决方案

升级Qt6,马上解决这个问题


http://www.mrgr.cn/news/59006.html

相关文章:

  • SpringBoot启动报错java.nio.charset.MalformedInputException: Input length =1
  • MyHdfs代码分享
  • 数字图像处理的概念(一)
  • 软件定义存储与设备的比较
  • 护照如何查验真伪?C++护照查验接口示例、护照文字识别、身份验证
  • gitlab 迁移
  • 解决Redis缓存穿透(缓存空对象、布隆过滤器)
  • React中的hook
  • Bat 案例 -- 注册入站端口
  • PD诱骗取电快充协议,一款可额外定制功能的快充协议芯片
  • 119.WEB渗透测试-信息收集-ARL(10)
  • HT7181 16.8V,14A高效升压转换器
  • linux中myshell的实现
  • 长短期记忆网络(LSTM)详解
  • unity游戏开发之塔防游戏
  • 词云图大师支持词云图字体预览,轻松选择字体样式!
  • list 的实现
  • SQL语句的书写顺序与实际执行顺序的差异,以及如何利用执行顺序优化查询性能
  • SpringBoot中EasyExcel使用实践总结
  • 【Java】java 集合框架(详解)
  • 电脑连接海康相机并在PictureBox和HWindowControl中分别显示。
  • 开源数据库 - mysql - 组织结构(与oracle的区别)
  • 系统调用的介绍
  • 每日“亿“题 东方博宜OJ 1538 - 小 X 与煎饼达人(flip)
  • 线程安全介绍
  • 代码随想录算法训练营第55天|最小生成树:prim、kruskal算法