如何获取PyQt中QGridLayout组件的左上角坐标?
如何获取QGridLayout的全局左上角坐标?
我用Qt Designer创建了GUI界面,里面包含一个QGridLayout组件,需要获取它的左上角坐标。从.ui文件转换得到的.py代码如下:
self.widget = QtWidgets.QWidget(Form) self.widget.setGeometry(QtCore.QRect(200, 130, 731, 571)) self.widget.setObjectName("widget") self.gridLayout = QtWidgets.QGridLayout(self.widget) self.gridLayout.setContentsMargins(0, 0, 0, 0) self.gridLayout.setObjectName("gridLayout")
在GUI窗口中点击该布局区域时,打印event.pos()显示其左上角坐标为(200,130),但调用self.gridLayout.geometry()返回的结果是PyQt5.QtCore.QRect(0, 0, 731, 571)——宽高正确,但x、y坐标不对,请问该怎么正确获取QGridLayout的左上角坐标?
解决方法
QGridLayout的geometry()返回的是相对于其父容器(即self.widget)的局部坐标,所以会显示(0,0)——因为你设置了setContentsMargins(0,0,0,0),布局铺满了整个父widget。要得到它在窗口中的全局坐标,需要结合父widget的坐标做转换:
情况1:布局铺满父widget(当前场景)
直接获取父widget的全局左上角坐标即可,这就是布局的全局坐标:
# 将父widget的局部原点(0,0)转换为全局坐标 layout_global_pos = self.widget.mapToGlobal(QtCore.QPoint(0, 0)) print(layout_global_pos) # 输出应为(200, 130)
情况2:布局未铺满父widget
如果后续修改了布局边距或父widget有其他布局,先获取布局在父widget中的局部矩形,再转换为全局坐标:
# 获取布局在父widget中的局部矩形 layout_local_rect = self.gridLayout.geometry() # 将布局的局部左上角点转换为全局坐标 layout_global_pos = self.widget.mapToGlobal(layout_local_rect.topLeft()) print(layout_global_pos)
核心逻辑是:布局的坐标系统依附于父容器,而点击事件的pos()是相对于顶层窗口的全局坐标,必须通过mapToGlobal()方法完成局部坐标到全局坐标的转换。
内容的提问来源于stack exchange,提问作者Altmcs
相关产品推荐
相关产品推荐

