如何获取控件所在的坐标位置

窗口的坐标体系及接口

 

获取坐标的接口在Widget类中,即控件的坐标信息属于基类的成员。基本的坐标体系如图所示

如何获取控件所在的坐标位置_第1张图片

通过接口打印出 lable_3的坐标值

print(self.label_3.geometry().x())

print(self.label_3.geometry().y())

   如何获取控件所在的坐标位置_第2张图片

   在实例的初始化接口__init__中调用这个接口获取到的值是0,非实际情况,这个和预期值不符合。如上图所示。实际上只有在show之后,才能获取到有效的坐标。上图中__init__和show接口之前获取到的坐标都是0,0;而在调用show后获取到的是103,0,然而这个坐标看起来和100,200这个坐标还是有差距。

     增加代码,在控件属性中,将控件坐标设置为100,200,但获取到的坐标却不是此值。

如何获取控件所在的坐标位置_第3张图片

 参考资料:

  1. https://stackoverflow.com/questions/32787868/pyqt-layout-and-setgeometry-basic-overview  坐标体系图及相关接口

 

坐标的分类

坐标分为:

  1. 窗口坐标。以窗口的左上角为起始坐标(0,0)
  2. 显示器坐标。以显示器的左上角为起始坐标 (0,0)

  两者存在一个差值。

  另外有绝对坐标和相对坐标的概念。

  在进行窗体设计时,采用了layout、 splitter及容器类的控件时,此时通过第一节中接口获取的坐标信息是相对于这些控件的坐标,而非相对于窗口起点的坐标信息。

 示例:黑色窗口中加一个蓝色组件,而后组件中添加一个按钮,组件相对窗口的坐标为(100,20),而按钮相对组件的坐标为(5,30),此时通过第一节中geometry()接口获取的坐标信息为(5,30),而非(100+5,20+30)。

                                                                                          

如何获取控件所在的坐标位置_第4张图片

 

第一节中坐标获取为(103,0)的原因:窗体在设计时,采用了布局。将splitter删除掉,就可以获取到相对窗口的坐标,并且在调用show接口之前就可以获取到。

如何获取控件所在的坐标位置_第5张图片

参考文献:

  1. https://zhuanlan.zhihu.com/p/28559136  此篇关于 layout及坐标系的文章。介绍了addStretch函数  控制控件随窗体的变化而变化,不至于在窗体变化时被隐藏。在qt designer工具对应 spacers两个控件。
  2. https://blog.csdn.net/yh_1988/article/details/6773451    介绍了相对坐标的举例。但是文中最后判断鼠标的位置代码并不准确。

判断光标和控件的位置关系

 

方法:

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) 通过此接口判断光标是否在控件中即可。

 如何获取控件所在的坐标位置_第6张图片

  上图中Sp2对应lable_3,QRect记录了sp2相对 Grid layout的坐标。QPoint是当前 光标 相对于sp2左上角的坐标。

 

 参考资料

1) https://blog.csdn.net/u013189731/article/details/39576337   Qt获取控件位置,坐标总结。窗口坐标和显示器绝对坐标的转换关系。

你可能感兴趣的:(python,pyqt的开发应用)