背景
无边框透明背景透明的窗口,在随着缩放比例非整数倍数放大时的画面发生了露底、撕裂问题。
当我们在使用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,马上解决这个问题