You need to enable JavaScript to run this app. PyQt5中QObject与QGraphicsItem多继承调用setFlags()崩溃问题
优惠活动
大模型
产品
解决方案
定价
更多

PyQt5中QObject与QGraphicsItem多继承调用setFlags()崩溃问题

问题原因

  • 这是PyQt5的SIP绑定机制对自定义多重Qt类继承的处理限制导致的。QGraphicsItem本身不是QObject的子类,你手动同时继承QObject和QGraphicsItem时,PyQt5的元对象系统无法正确计算两个父类的内存布局偏移,调用QGraphicsItem的成员方法时会出现指针访问错误,触发段错误直接崩溃,不会抛出Python层的异常。
  • PySide2使用的Shiboken绑定生成器对这类多重继承场景的兼容性更好,能正确处理不同父类的指针偏移,所以相同代码可以正常运行。
  • 你没有操作遗漏,这是PyQt5本身的绑定特性决定的。

修复方案

Qt本身已经提供了专门的类QGraphicsObject,这个类原生同时继承了QObject和QGraphicsItem,完全适配PyQt5的元对象机制,直接用这个类作为父类即可,不需要手动多继承。
修改你的Item类定义部分:

# 首先导入QGraphicsObject
from PyQt5.QtWidgets import QGraphicsObject

# 修改继承关系
class Item(QGraphicsObject):
    def __init__(self):
        super().__init__()
        
        self.setFlags(QGraphicsItem.ItemIsSelectable | QGraphicsItem.ItemIsMovable |
                      QGraphicsItem.ItemSendsScenePositionChanges)

    # 剩余的boundingRect、paint方法不需要做任何修改

修改后代码即可正常运行,功能和你原来的实现完全一致。


内容的提问来源于stack exchange,提问作者nutrx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 03:24:04