前言
最近做项目,需求要求不管在什么DPI下,都要保证一个小窗口,显示在一个相对大屏固定位置的地方,误差要求很小。
一开始我的思路是按比例设,Qt的坐标(0,0)在左上角,我就以屏幕宽度的90%,屏幕高度的80%,Move窗口,结果出现了意外的情况,右侧的窗口,在比例正确的情况下总是会有一部分跑到屏幕外边去,而且DPI越大跑的越多;经调查后发现了一些需要注意的点。
解决
其实按比例设置xy坐标的做法是正确的,只是这个xy只定住了窗口的左上角坐标,DPI发生变化后,虽然我一直给窗口设置的150px*50px,其实相对于屏幕的显示大小,发生了变化,DPI越大,窗口相对于当前的屏幕就越大;所以对于相同位置的点,因为窗口变大了,show出来的窗口就会发生偏移。这里有两种解决思路:
1.从右往左算出来距离,不要直接乘比例算,这样不管窗口的大小怎么变,窗口的最右侧永远也会空出来一段距离,只是这样算出来的点位置会发生一些偏移,无伤大雅
1 | QRectF rect = QApplication::desktop()->geometry(); |
2.对窗口也乘以比例,例如相对于3840px*2160px分辨率,窗口的大小是150px*50px,则当DPI为2.0时,分辨率就相当于1920px*1080px,那么窗口也要对应的➗2,才能保持相对位置不变
附录
- [DPI] 1.0 3840 2120
- [DPI] 1.25 3072 1688
- [DPI] 1.5 2560 1400
- [DPI] 1.75 2194 1195
- [DPI] 2.0 1920 1040
- [DPI] 2.25 1707 920
- [DPI] 2.5 1536 824
- [DPI] 2.75 1396 764