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

窗口的坐标体系及接口

 

获取坐标的接口在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,但获取到的坐标却不是此值。

 参考资料:

  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)。

                                                                                          

 

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

参考文献:

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

 

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

 

 参考资料

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

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

proware

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值