解决QGraphicsScene在添加固定大小Item时出现异常行为

解决qgraphicsscene在添加固定大小item时出现异常行为

本文旨在解决在使用PySide6的QGraphicsScene和QGraphicsView时,动态添加设置了ItemIgnoresTransformations标志的固定大小Item后,场景矩形(sceneRect)计算错误,导致视图显示不正确的bug。我们将探讨问题的原因,并提供一个简单的修复方案,确保Item在缩放过程中保持固定大小。

问题描述

在使用QGraphicsScene和QGraphicsView时,我们经常需要在场景中添加一些固定大小的Item,这些Item不应该随着视图的缩放而改变大小。为了实现这个目的,我们通常会设置Item的ItemIgnoresTransformations标志。

然而,如果在Qt事件循环启动后,动态地向场景中添加这些Item,QGraphicsScene的sceneRect可能会计算错误,导致视图显示不正确,具体表现为视野范围被压缩到右上角。

问题原因分析

经过分析,这似乎是Qt框架本身的一个bug。当Item的ItemIgnoresTransformations标志被设置时,QGraphicsScene在某些情况下无法正确地更新其sceneRect。特别是在事件循环启动后动态添加Item时,这个问题更容易出现。

立即学习“前端免费学习笔记(深入)”;

解决方案

一个简单的解决方案是在添加Item后,手动调用QGraphicsItem.sceneTransform()方法。这个方法会强制Qt重新计算Item的变换矩阵,从而触发QGraphicsScene更新sceneRect。

下面是修改后的代码示例:

import randomimport sysprint("Python: ", sys.version)import PySide6print("PySide: ", PySide6.__version__)from PySide6 import QtCore, QtGui, QtWidgetsclass LocationGraphicsItem(QtWidgets.QGraphicsEllipseItem):    def __init__(self, coordinate, parent = None):        super().__init__(parent=parent)        x = coordinate[0]        y = -coordinate[1]        self.setRect(-5, -5, 10, 10)        self.setPos(x, y)        self.setBrush(QtGui.QColor("blue"))        self.setFlag(self.GraphicsItemFlag.ItemIgnoresTransformations)def add_something():    print(scene.sceneRect())    point =(3.4e6+random.random()*1e5, 5.3e6+random.random()*1e5)    print("Random point: ", point)    item = LocationGraphicsItem(point)    scene.addItem(item)    item.setVisible(True)    item.ensureVisible()    # 强制更新sceneTransform    dummy = item.sceneTransform()    view.fitInView(scene.sceneRect(), QtCore.Qt.KeepAspectRatio)    QtWidgets.QApplication.processEvents()    print(scene.sceneRect())if __name__ == "__main__":    my_points = [(3412770.9, 5358376.3), (3495180.5, 5371890.1), (3495099.1, 5370624.6), (3485765.4, 5371030.1)]    app = QtWidgets.QApplication()    scene = QtWidgets.QGraphicsScene()    for point in my_points:        item = LocationGraphicsItem(point)        scene.addItem(item)        item.setVisible(True)        item.ensureVisible()    window = QtWidgets.QMainWindow(parent = None)    window.setGeometry(50, 50, 1300, 750)    basic_widget = QtWidgets.QWidget(parent=window)    window.setCentralWidget(basic_widget)    layout = QtWidgets.QHBoxLayout()    basic_widget.setLayout(layout)    button = QtWidgets.QPushButton("add something", parent = basic_widget)    button.clicked.connect(add_something)    layout.addWidget(button)    view = QtWidgets.QGraphicsView(scene, parent = basic_widget)    layout.addWidget(view)    view.fitInView(scene.sceneRect(), QtCore.Qt.KeepAspectRatio)    window.setVisible(True)    app.exec()

在add_something函数中,我们添加了dummy = item.sceneTransform()这行代码。这行代码会强制Qt重新计算Item的变换矩阵,从而修复sceneRect计算错误的问题。

其他解决方案

除了手动调用sceneTransform()之外,还可以考虑以下替代方案:

使用itemsBoundingRect()重新计算场景矩形: 虽然原文提到itemsBoundingRect()比较慢,但在某些情况下,这可能是唯一的选择。可以尝试优化代码,减少调用itemsBoundingRect()的次数。自定义Item的绘制方式: 可以通过重写QGraphicsItem的paint()方法,手动绘制Item,从而避免使用ItemIgnoresTransformations标志。这种方法比较复杂,但可以提供更高的灵活性。延迟添加Item: 如果可以接受,可以考虑在事件循环启动之前添加所有Item。

总结

在使用QGraphicsScene和QGraphicsView时,动态添加设置了ItemIgnoresTransformations标志的固定大小Item可能会导致sceneRect计算错误。本文提供了一个简单的修复方案,即在添加Item后手动调用QGraphicsItem.sceneTransform()方法。同时,也介绍了其他可能的替代方案。希望本文能够帮助你解决在使用PySide6开发图形界面时遇到的问题。强烈建议向Qt官方报告此bug,以便在未来的版本中得到修复。

以上就是解决QGraphicsScene在添加固定大小Item时出现异常行为的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1370913.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Python模块导入深度解析:Pathlib与sys.path的兼容性问题
上一篇 2025年12月14日 10:58:15
python中isinstance()和type()有什么区别?
下一篇 2025年12月14日 10:58:31

相关推荐

  • 平安好车主怎么进行车况检测_平安好车主进行车况检测详细方法

    通过平安好车主APP可便捷查询车辆状态并预约线下检测,首先绑定车辆信息后查看年检、保险及违章记录,再通过【年检代办】或【爱车检测】入口预约第三方机构免费取还车服务,最后利用【查车况】功能输入VIN码获取历史出险与维修记录,全面掌握车况。 如果您想了解车辆的健康状况并确保其符合年检标准,可以通过平安好…

    2026年8月25日
    400
  • Win7文件夹WinSxS有什么作用?是否可以删除?

    winsxs文件夹有何用途?是否能够删除?当我们清理系统冗余文件或释放内存空间时,常常会注意到一个名为winsxs的文件夹,其占用的空间通常超过5gb。那么,我们是否可以将其删除呢?接下来,我将为大家详细解释winsxs的功能,这样您就可以自行判断是否可以对其进行清理。 相关说明: WinSxS文件…

    2026年8月25日
    200
  • 掌上高考志愿填报可靠吗

    掌上高考的准确性取决于数据来源与推荐逻辑透明度,其高校录取数据需核对是否来自教育部阳光高考平台或省级考试院,并对比目标院校官网公布的历年分数,偏差超5分应警惕;智能推荐功能须提供算法说明,明确使用位次法或线差法,纳入招生变动信息,且支持个性化调整,否则可信度受限。 如果您正在为高考志愿填报寻找可靠的…

    2026年8月25日
    200
  • 告别繁琐的对象映射:如何使用JoliCodeAutoMapper优化PHP开发效率

    最近在开发一个复杂的后端系统时,我遇到了一个反复出现的“痛点”:对象映射。想象一下这样的场景:你从前端接收一个 JSON 请求体,首先将其反序列化到一个 UserRequestDTO 对象。然而,你的业务逻辑和数据库操作需要的是一个 User 领域实体。这意味着你需要手动编写大量的代码,将 User…

    用户投稿 2026年8月25日
    000
  • Java中Gatling的特点 分析DSL测试

    Java中Gatling的特点 分析DSL测试Java中Gatling的特点 分析DSL测试Java中Gatling的特点 分析DSL测试Java中Gatling的特点 分析DSL测试

    gatling通过基于akka actor模型和netty io框架实现高并发处理,每个虚拟用户由轻量级actor表示,以非阻塞方式通信,减少线程开销;其dsl使用scala编写,但在java项目中可通过maven或gradle引入依赖并编写scala脚本定义测试场景,便于版本控制;gatling生…

    2026年8月25日 用户投稿
    700
  • 安装错误0x80070002怎么解决 0x80070002错误代码解决

    安装错误0x80070002怎么解决 0x80070002错误代码解决安装错误0x80070002怎么解决 0x80070002错误代码解决安装错误0x80070002怎么解决 0x80070002错误代码解决安装错误0x80070002怎么解决 0x80070002错误代码解决

    在安装windows更新或部分软件时,不少用户会遭遇“错误代码:0x80070002”的提示。该问题在win7、win10乃至win11系统中均有发生,一旦出现,安装流程将被迫中断,导致更新或程序无法正常完成。为帮助大家高效应对这一故障,请跟随以下步骤逐一排查并解决。 一、问题成因梳理 错误代码 0…

    2026年8月25日 用户投稿
    100
  • 第三方SDK(支付、短信、邮件)集成

    集成第三方sdk的步骤包括关注安全性、性能和用户体验。1) 确保api密钥安全存储和传输,使用https保护数据。2) 优化api调用频率,避免性能瓶颈。3) 提供友好的错误处理和反馈机制,提升用户体验。4) 合理控制短信和邮件发送频率和数量,管理成本。 在现代软件开发中,第三方SDK的集成是提升应…

    2026年8月25日
    100
  • win10事件查看器怎么打开_打开Win10事件查看器分析系统日志的方法

    首先打开事件查看器,可通过运行命令、开始菜单搜索、计算机管理、任务管理器、控制面板、PowerShell或WinX菜单等多种方式启动,随后在Windows日志中筛选系统或应用程序下的错误与警告条目,查看事件ID、来源及详细描述以排查问题。 如果您需要排查系统错误或应用程序崩溃等问题,但无法找到相关记…

    2026年8月25日
    000
  • 华为Sound X 2024对决Sonos Era 300:智能音箱的空间音频与音质表现,谁家的声音更具包围感?

    华为Sound X 2024主打单体虚拟包围感,依赖帝瓦雷三分频设计与空间感知算法,提供出色声场和低频;Sonos Era 300则通过11单元硬件布局支持杜比全景声,实现真实三维环绕,适合影音发烧友。 华为Sound X 2024和Sonos Era 300都是高端智能音箱,主打沉浸式听感,但在实…

    2026年8月25日
    000
  • 快看漫画网页版在线看:免安装,极速加载

    快看漫画网页版无需下载App即可在线追更,首页按分类推荐热门国漫如《难哄》《好一个乖乖女》,支持搜索直达《天命大反派》等作品最新话,页面适配手机流畅阅读,加载快速清晰度够用,WiFi下体验佳,部分章节有会员抢先提示但更新日后可免费看,偶有推广弹窗可关闭,整体干扰小。 打开快看漫画网页版,不用下载Ap…

    2026年8月25日
    000
  • PHP中复杂异步操作的回调地狱与阻塞困境:GuzzlePromises如何优雅化解

    可以通过一下地址学习composer:学习地址 在现代web应用开发中,php早已不再局限于简单的页面渲染,而是越来越多地承担起与各种外部服务(如微服务、第三方api、数据库等)进行复杂交互的任务。想象一下,你正在开发一个电商网站的商品详情页,需要同时从多个数据源获取信息:商品基本信息、用户评论、库…

    用户投稿 2026年8月25日
    000
  • kimichat官网入口地址分享-kimichat最新官网登录网址获取

    Kimi官网入口为https://kimi.moonshot.cn/,支持手机号快捷登录,具备实时联网搜索、大文件上传解析、多轮对话管理及Kimi+智能应用等功能,提供跨设备同步与简洁交互体验。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜…

    2026年8月25日
    000
  • C语言实现1到100累加

    C语言实现1到100累加C语言实现1到100累加C语言实现1到100累加C语言实现1到100累加

    本题难度较低,可通过循环结构实现累加计算,重点在于使用三种不同的循环语句完成相同功能。 1、 启动CodeBlocks开发环境,创建一个新项目以进行后续操作。 2、 选择C语言类型,并将项目命名为MaxNum,方便后期维护与识别。 3、 按照提示继续操作,直至项目创建成功。 立即学习“C语言免费学习…

    2026年8月25日 用户投稿
    000
  • VSCode怎么切换解释器_VSCode更换Python/Node等运行环境教程

    答案:在VSCode中切换解释器需通过命令面板或状态栏选择Python解释器,使用nvm或配置settings.json切换Node版本,遇报错可重启、检查扩展与路径,避免自动回切需手动指定并禁提示。 在VSCode中切换解释器,其实就是告诉VSCode用哪个Python环境,或者哪个Node版本来…

    2026年8月25日
    000
  • PowerPoint演示文稿怎么设置演示者视图_PPT演示者视图使用技巧

    要使用演示者视图,需连接第二屏幕并设置为扩展模式,打开PowerPoint的“使用演示者视图”选项,通过Alt+F5(Windows)或Command+Shift+Enter(Mac)启动放映,即可在本地查看备注、预览和计时,观众仅见幻灯片内容。 如果您在进行PowerPoint演示时希望看到备注内…

    2026年8月25日
    000
  • 电脑USB接口失灵怎么办 一文教你快速修复

    电脑USB接口失灵怎么办 一文教你快速修复电脑USB接口失灵怎么办 一文教你快速修复电脑USB接口失灵怎么办 一文教你快速修复电脑USB接口失灵怎么办 一文教你快速修复

    usb接口作为现代计算机与外部设备通信的重要通道,一旦出现故障,往往会影响日常使用。但大多数情况下,这类问题并非无法解决。本文将由浅入深,系统地为您介绍多种有效的修复方案,帮助您快速恢复usb接口的正常功能。 一、检查物理连接并重启设备 首先应排除最基础的硬件连接问题。重新插拔设备、重启电脑,并尝试…

    2026年8月25日 用户投稿
    000
  • CSRF(跨站请求伪造)防护机制

    有效防护csrf攻击的方法包括:1. 使用csrf token,通过在表单中嵌入随机生成的token并在提交时验证其匹配性,确保请求合法性;2. 同源检测,通过检查请求的origin和referer头,确保请求来自同一个域名;3. 双重cookie验证,将token存储在cookie和请求头中,验证…

    2026年8月25日
    000
  • 兆易创新Q1营收预计达19.09亿元,同比环比双增长

    ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 4月8日,兆易创新发布公告称,经公司财务部门初步测算,公司预计2025年第一季度实现营业收入19.09亿元左右,同比增长17.32%左右,环比增长11.88%左右。2024年第四季度至2025年…

    2026年8月25日
    100
  • win10电脑插耳机没声音怎么办 5步搞定

    win10电脑插耳机没声音怎么办 5步搞定win10电脑插耳机没声音怎么办 5步搞定win10电脑插耳机没声音怎么办 5步搞定win10电脑插耳机没声音怎么办 5步搞定

    在使用windows 10系统的过程中,不少用户会遇到插入耳机后没有声音的问题。这种情况通常由驱动故障、音频配置错误或硬件连接异常引起。接下来,我们一起来看看几种有效的解决方法。 一、确认耳机与接口是否正常 1、测试耳机是否完好:将耳机连接到手机或其他电脑上,检查是否能正常播放声音,以排除耳机本身损…

    2026年8月25日 用户投稿
    200
  • Win7激活密钥怎么使用?

    windows 7 系统提供了多种激活方法,其中通过输入激活密钥进行激活是一种简便的方式。然而,许多用户对如何使用激活密钥感到困惑,因此本文将详细介绍这一过程。 尽管部分用户由于不了解激活流程而未安装 Windows 7 系统,但实际上,激活 Windows 7 的方式非常多样,其中利用激活密钥的方…

    2026年8月25日
    000

发表回复

登录后才能评论
关注微信