处理窗口大小的踩坑

最近在给某个项目设计窗口尺寸的时候,发现怎么设置都会出现设定尺寸和实际在窗口中的尺寸都不一样,而且距离屏幕左上角越远,差值越大,但是很奇怪的是我单独写的测试脚本都没有问题。后来无意间发现可能是这个项目的GUI设置了自适应高DPI1,这就导致实际在窗口中的尺寸和通过geometry()获取到的不一样,比如你在代码中设定的坐标系为x=100px、y=100px,如果是在100%缩放的系统中,通过测量获取到的位置确实是(100,100),但是在125%缩放的系统中,你能测量到的尺寸却是(125,125)

既然找到了问题,那么解决办法是需要获取当前系统的缩放比,经过测试下面的代码是可用的

Python
def get_dpi():
    return ctypes.windll.shcore.GetScaleFactorForDevice(0) / 100

那么利用geometry获取到的x()和y()都要乘以这个百分比,也就是

Python
class MainWindow(QWidget):
    ...
    def get_resize(self):

        x=int(self.geometry().x() * get_dpi())
        y=int(self.geometry().y() * get_dpi())
这样才能获取准确的位置


  1. 关于DPI方面的问题可以参考“【硬件科普】换了更高分辨率的显示器,软件界面反而模糊-Windows缩放详解”Bilibili视频