前言

最近做项目,需求要求不管在什么DPI下,都要保证一个小窗口,显示在一个相对大屏固定位置的地方,误差要求很小。

一开始我的思路是按比例设,Qt的坐标(0,0)在左上角,我就以屏幕宽度的90%,屏幕高度的80%,Move窗口,结果出现了意外的情况,右侧的窗口,在比例正确的情况下总是会有一部分跑到屏幕外边去,而且DPI越大跑的越多;经调查后发现了一些需要注意的点。

解决

其实按比例设置xy坐标的做法是正确的,只是这个xy只定住了窗口的左上角坐标,DPI发生变化后,虽然我一直给窗口设置的150px*50px,其实相对于屏幕的显示大小,发生了变化,DPI越大,窗口相对于当前的屏幕就越大;所以对于相同位置的点,因为窗口变大了,show出来的窗口就会发生偏移。这里有两种解决思路:

1.从右往左算出来距离,不要直接乘比例算,这样不管窗口的大小怎么变,窗口的最右侧永远也会空出来一段距离,只是这样算出来的点位置会发生一些偏移,无伤大雅

1
2
3
4
5
6
7
8
QRectF rect = QApplication::desktop()->geometry();
int nWidth = rect.width();
int nHeight = rect.height();

//nWidth - nWidth*0.035 - toolBox->width() = 屏幕宽度-右侧要空出的间距-窗口本体的宽度
toolBox->move(nWidth - nWidth*0.035 - toolBox->width(), nHeight*0.79);
toolBox->show();
toolBox->activateWindow();

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