当前位置: 首页 > news >正文

PySide(PyQT),QGraphicsItem的pos()和scenePos()区别

        在QGraphicsItem中,pos()和scenePos()是两个重要的方法,用于描述图形项的位置,但它们的含义和用途有所不同。理解它们的区别对于正确操作和管理QGraphicsItem的位置至关重要。

1. pos()方法

        • 定义:pos()返回的是QGraphicsItem在其父项坐标系中的位置(以QPointF表示)。

        • 用途:当你需要操作图形项相对于其父项的位置时,使用pos()。

        • 场景:

        • 如果图形项没有父项(即它是场景的顶层项),pos()表示的是它在场景坐标系中的位置。

        • 如果图形项有父项,pos()表示的是它相对于父项的位置。


2. scenePos()方法

        • 定义:scenePos()返回的是QGraphicsItem在场景坐标系中的位置(以QPointF表示)。

        • 用途:当你需要获取图形项在场景中的绝对位置时,使用scenePos()。

        • 场景:

        • 无论图形项是否有父项,scenePos()总是返回它在场景中的全局位置。

        • 如果图形项有父项,scenePos()会自动将局部坐标转换为场景坐标。


3. 区别总结

 特性pos()scenePos()
坐标系父项坐标系(局部坐标)场景坐标系(全局坐标)
顶层项如果没有父项,pos() 和 scenePos() 的值相同总是返回场景中的绝对位置
有父项 返回相对于父项的位置返回场景中的绝对位置
用途操作局部位置获取全局位置

 
4. 示例代码

from PySide6.QtWidgets import QGraphicsRectItem, QGraphicsScene, QGraphicsView, QApplication
from PySide6.QtCore import QRectF, Qt


app = QApplication([])

scene = QGraphicsScene()
view = QGraphicsView(scene)

# 创建父项
parent_item = QGraphicsRectItem(50, 50, 200, 200)
parent_item.setBrush(Qt.GlobalColor.lightGray)
scene.addItem(parent_item)

# 创建子项
child_item = QGraphicsRectItem(80, 80, 100, 100)
child_item.setBrush(Qt.GlobalColor.blue)
child_item.setParentItem(parent_item) # 设置父项
child_item.setPos(100, 100) # 设置子项在父项中的位置

parent_item.setPos(100, 100) # 设置父项在场景中的的位置

# 打印位置信息
print(f"Child pos(): {child_item.pos()}") # 子项的局部位置(100,100)
print(f"Child scenePos(): {child_item.scenePos()}") # 子项的场景位置(200,200)

view.setScene(scene)
view.show()
app.exec()


5.实际应用场景

    • pos()的使用场景:

        • 当需要调整图形项相对于其父项的位置时。

        • 当需要在局部坐标系中进行操作(例如,子项相对于父项的布局)。

    • scenePos()的使用场景:

        • 当需要获取图形项在场景中的绝对位置时。

        • 当需要与其他图形项进行全局比较或交互时(例如,碰撞检测、鼠标事件处理)。

总结

        • pos()表示图形项在其父项坐标系中的位置。

        • scenePos()表示图形项在场景坐标系中的绝对位置。

        • 根据需求选择合适的坐标系和方法,可以更灵活地操作和管理图形项的位置。

相关文章:

  • 【数据分析大屏】基于Django+Vue汽车销售数据分析可视化大屏(完整系统源码+数据库+开发笔记+详细部署教程+虚拟机分布式启动教程)✅
  • Kotlin D3
  • 推理模型对SQL理解能力的评测:DeepSeek r1、GPT-4o、Kimi k1.5和Claude 3.7 Sonnet
  • H3C交换机的VRRP配置
  • Ansible运行原理揭秘:如何用YAML脚本掌控数服务器?
  • 第二篇:CTF常见题型解析:密码学、逆向工程、漏洞利用、Web安全
  • vue3 element-plus form校验不生效
  • python-leetcode-递增的三元子序列
  • 详细介绍 Jupyter nbconvert 工具及其用法:如何将 Notebook 转换为 Python 脚本
  • 数据库系统概论(三)数据库系统的三级模式结构
  • 软考 中级软件设计师 考点知识点笔记总结 day03
  • Blender UV纹理贴图,导出FBX到Unity
  • SqlSugar 进阶之原生Sql操作与存储过程写法 【ORM框架】
  • centos安装python3.9.9总结和笔记
  • coze ai assistant Task 1
  • Java中的常用关键字
  • 基于SpringBoot的校园二手交易平台(计算机毕设-JAVA)
  • Oracle/MySQL/PostgreSQL 到信创数据库数据同步简介
  • uniapp在APP平台(Android/iOS)选择非媒体文件
  • 参考thinkphp架构的FastAPI实现思路
  • 鸿海下调全年营收展望:AI服务器业务强劲,预计今年营收增超50%
  • 知名猎头公司创始人兼首席执行官庄华因突发疾病逝世,享年62岁
  • 菲律宾中期选举初步结果出炉,杜特尔特家族多人赢得地方选举
  • 国务院关税税则委:调整对原产于美国的进口商品加征关税措施
  • 支持企业增强战略敏捷更好发展,上海市领导密集走访外贸外资企业
  • 今起公开发售,宁德时代将于5月20日在港股上市