获取坐标的接口在Widget类中,即控件的坐标信息属于基类的成员。基本的坐标体系如图所示
通过接口打印出 lable_3的坐标值
print(self.label_3.geometry().x())
print(self.label_3.geometry().y())
在实例的初始化接口__init__中调用这个接口获取到的值是0,非实际情况,这个和预期值不符合。如上图所示。实际上只有在show之后,才能获取到有效的坐标。上图中__init__和show接口之前获取到的坐标都是0,0;而在调用show后获取到的是103,0,然而这个坐标看起来和100,200这个坐标还是有差距。
增加代码,在控件属性中,将控件坐标设置为100,200,但获取到的坐标却不是此值。
参考资料:
坐标分为:
两者存在一个差值。
另外有绝对坐标和相对坐标的概念。
在进行窗体设计时,采用了layout、 splitter及容器类的控件时,此时通过第一节中接口获取的坐标信息是相对于这些控件的坐标,而非相对于窗口起点的坐标信息。
示例:黑色窗口中加一个蓝色组件,而后组件中添加一个按钮,组件相对窗口的坐标为(100,20),而按钮相对组件的坐标为(5,30),此时通过第一节中geometry()接口获取的坐标信息为(5,30),而非(100+5,20+30)。
第一节中坐标获取为(103,0)的原因:窗体在设计时,采用了布局。将splitter删除掉,就可以获取到相对窗口的坐标,并且在调用show接口之前就可以获取到。
参考文献:
方法:
1)首先采用接口mousePos=self.label_3.mapFromGlobal(QCursor.pos())将光标的显示器坐标转换到 相对于控件label_3的坐标。
2)获取控件的窗口坐标信息 widgetRect=self.label_3.geometry(),通过此接口获取坐标及控件的长、宽。
3)在2)中获取到的控件窗口坐标信息是相对于其上一级窗口,因而将获取到的坐标信息设置为起始值(0,0),但是长、宽保持不变。这样widgetRect中即为0-width,0-length的一个矩形。
4)widgetRect.contains(mousePos) 通过此接口判断光标是否在控件中即可。
上图中Sp2对应lable_3,QRect记录了sp2相对 Grid layout的坐标。QPoint是当前 光标 相对于sp2左上角的坐标。
参考资料:
1) https://blog.csdn.net/u013189731/article/details/39576337 Qt获取控件位置,坐标总结。窗口坐标和显示器绝对坐标的转换关系。